inherit_from: .rubocop_todo.yml

# Common configuration.

AllCops:
  RubyInterpreters:
    - ruby
    - macruby
    - rake
    - jruby
    - rbx
  # Include common Ruby source files.
  Include:
    - '**/*.rb'
    - '**/*.arb'
    - '**/*.axlsx'
    - '**/*.builder'
    - '**/*.fcgi'
    - '**/*.gemfile'
    - '**/*.gemspec'
    - '**/*.god'
    - '**/*.jb'
    - '**/*.jbuilder'
    - '**/*.mspec'
    - '**/*.opal'
    - '**/*.pluginspec'
    - '**/*.podspec'
    - '**/*.rabl'
    - '**/*.rake'
    - '**/*.rbuild'
    - '**/*.rbw'
    - '**/*.rbx'
    - '**/*.ru'
    - '**/*.ruby'
    - '**/*.spec'
    - '**/*.thor'
    - '**/*.watchr'
    - '**/.irbrc'
    - '**/.pryrc'
    - '**/.simplecov'
    - '**/buildfile'
    - '**/Appraisals'
    - '**/Berksfile'
    - '**/Brewfile'
    - '**/Buildfile'
    - '**/Capfile'
    - '**/Cheffile'
    - '**/Dangerfile'
    - '**/Deliverfile'
    - '**/Fastfile'
    - '**/*Fastfile'
    - '**/Gemfile'
    - '**/Guardfile'
    - '**/Jarfile'
    - '**/Mavenfile'
    - '**/Podfile'
    - '**/Puppetfile'
    - '**/Rakefile'
    - '**/rakefile'
    - '**/Snapfile'
    - '**/Steepfile'
    - '**/Thorfile'
    - '**/Vagabondfile'
    - '**/Vagrantfile'
  Exclude:
    - '.bundle/**/*'
    - 'node_modules/**/*'
    - 'tmp/**/*'
    - 'vendor/**/*'
    - '.git/**/*'
    - 'stuff/**/*'
  # Default formatter will be used if no `-f/--format` option is given.
  DefaultFormatter: progress
  # Cop names are displayed in offense messages by default. Change behavior
  # by overriding DisplayCopNames, or by giving the `--no-display-cop-names`
  # option.
  DisplayCopNames: true
  # Style guide URLs are not displayed in offense messages by default. Change
  # behavior by overriding `DisplayStyleGuide`, or by giving the
  # `-S/--display-style-guide` option.
  DisplayStyleGuide: false
  # When specifying style guide URLs, any paths and/or fragments will be
  # evaluated relative to the base URL.
  StyleGuideBaseURL: https://rubystyle.guide
  # Extra details are not displayed in offense messages by default. Change
  # behavior by overriding ExtraDetails, or by giving the
  # `-E/--extra-details` option.
  ExtraDetails: false
  # Additional cops that do not reference a style guide rule may be enabled by
  # default. Change behavior by overriding `StyleGuideCopsOnly`, or by giving
  # the `--only-guide-cops` option.
  StyleGuideCopsOnly: false
  # All cops except the ones configured `Enabled: false` in this file are enabled by default.
  # Change this behavior by overriding either `DisabledByDefault` or `EnabledByDefault`.
  # When `DisabledByDefault` is `true`, all cops in the default configuration
  # are disabled, and only cops in user configuration are enabled. This makes
  # cops opt-in instead of opt-out. Note that when `DisabledByDefault` is `true`,
  # cops in user configuration will be enabled even if they don't set the
  # Enabled parameter.
  # When `EnabledByDefault` is `true`, all cops, even those configured `Enabled: false`
  # in this file are enabled by default. Cops can still be disabled in user configuration.
  # Note that it is invalid to set both EnabledByDefault and DisabledByDefault
  # to true in the same configuration.
  EnabledByDefault: false
  DisabledByDefault: false
  # New cops introduced between major versions are set to a special pending status
  # and are not enabled by default with warning message.
  # Change this behavior by overriding either `NewCops: enable` or `NewCops: disable`.
  # When `NewCops` is `enable`, pending cops are enabled in bulk. Can be overridden by
  # the `--enable-pending-cops` command-line option.
  # When `NewCops` is `disable`, pending cops are disabled in bulk. Can be overridden by
  # the `--disable-pending-cops` command-line option.
  NewCops: pending
  # Enables the result cache if `true`. Can be overridden by the `--cache` command
  # line option.
  UseCache: true
  # Threshold for how many files can be stored in the result cache before some
  # of the files are automatically removed.
  MaxFilesInCache: 20000
  # The cache will be stored in "rubocop_cache" under this directory. If
  # CacheRootDirectory is ~ (nil), which it is by default, the root will be
  # taken from the environment variable `$XDG_CACHE_HOME` if it is set, or if
  # `$XDG_CACHE_HOME` is not set, it will be `$HOME/.cache/`.
  # The CacheRootDirectory can be overwritten by passing the `--cache-root` command
  # line option or by setting `$RUBOCOP_CACHE_ROOT` environment variable.
  CacheRootDirectory: ~
  # It is possible for a malicious user to know the location of RuboCop's cache
  # directory by looking at CacheRootDirectory, and create a symlink in its
  # place that could cause RuboCop to overwrite unintended files, or read
  # malicious input. If you are certain that your cache location is secure from
  # this kind of attack, and wish to use a symlinked cache location, set this
  # value to "true".
  AllowSymlinksInCacheRootDirectory: false
  # What MRI version of the Ruby interpreter is the inspected code intended to
  # run on? (If there is more than one, set this to the lowest version.)
  # If a value is specified for TargetRubyVersion then it is used. Acceptable
  # values are specificed as a float (i.e. 3.0); the teeny version of Ruby
  # should not be included. If the project specifies a Ruby version in the
  # .tool-versions or .ruby-version files, Gemfile or gems.rb file, RuboCop will
  # try to determine the desired version of Ruby by inspecting the
  # .tool-versions file first, then .ruby-version, followed by the Gemfile.lock
  # or gems.locked file. (Although the Ruby version is specified in the Gemfile
  # or gems.rb file, RuboCop reads the final value from the lock file.) If the
  # Ruby version is still unresolved, RuboCop will use the oldest officially
  # supported Ruby version (currently Ruby 2.5).
  TargetRubyVersion: ~
  # Determines if a notification for extension libraries should be shown when
  # rubocop is run. Keys are the name of the extension, and values are an array
  # of gems in the Gemfile that the extension is suggested for, if not already
  # included.
  SuggestExtensions:
    rubocop-rails: [rails]
    rubocop-rspec: [rspec, rspec-rails]
    rubocop-minitest: [minitest]
    rubocop-sequel: [sequel]
    rubocop-rake: [rake]

#################### Bundler ###############################

Bundler/DuplicatedGem:
  Description: 'Checks for duplicate gem entries in Gemfile.'
  Enabled: true
  VersionAdded: '0.46'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

Bundler/GemComment:
  Description: 'Add a comment describing each gem.'
  Enabled: false
  VersionAdded: '0.59'
  VersionChanged: '0.85'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'
  IgnoredGems: []
  OnlyFor: []

Bundler/GemFilename:
  Description: 'Enforces the filename for managing gems.'
  Enabled: true
  VersionAdded: '1.20'
  EnforcedStyle: 'Gemfile'
  SupportedStyles:
    - 'Gemfile'
    - 'gems.rb'
  Include:
    - '**/Gemfile'
    - '**/gems.rb'
    - '**/Gemfile.lock'
    - '**/gems.locked'

Bundler/GemVersion:
  Description: 'Requires or forbids specifying gem versions.'
  Enabled: false
  VersionAdded: '1.14'
  EnforcedStyle: 'required'
  SupportedStyles:
    - 'required'
    - 'forbidden'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'
  AllowedGems: []

Bundler/InsecureProtocolSource:
  Description: >-
                 The source `:gemcutter`, `:rubygems` and `:rubyforge` are deprecated
                 because HTTP requests are insecure. Please change your source to
                 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
  Enabled: true
  VersionAdded: '0.50'
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

Bundler/OrderedGems:
  Description: >-
                 Gems within groups in the Gemfile should be alphabetically sorted.
  Enabled: true
  VersionAdded: '0.46'
  VersionChanged: '0.47'
  TreatCommentsAsGroupSeparators: true
  # By default, "-" and "_" are ignored for order purposes.
  # This can be overridden by setting this parameter to true.
  ConsiderPunctuation: false
  Include:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'

#################### Gemspec ###############################

Gemspec/DateAssignment:
  Description: 'Checks that `date =` is not used in gemspec file, it is set automatically when the gem is packaged.'
  Enabled: true
  VersionAdded: '1.10'
  Include:
    - '**/*.gemspec'

Gemspec/DuplicatedAssignment:
  Description: 'An attribute assignment method calls should be listed only once in a gemspec.'
  Enabled: true
  VersionAdded: '0.52'
  Include:
    - '**/*.gemspec'

Gemspec/OrderedDependencies:
  Description: >-
                 Dependencies in the gemspec should be alphabetically sorted.
  Enabled: true
  VersionAdded: '0.51'
  TreatCommentsAsGroupSeparators: true
  # By default, "-" and "_" are ignored for order purposes.
  # This can be overridden by setting this parameter to true.
  ConsiderPunctuation: false
  Include:
    - '**/*.gemspec'

Gemspec/RequiredRubyVersion:
  Description: 'Checks that `required_ruby_version` of gemspec is specified and equal to `TargetRubyVersion` of .rubocop.yml.'
  Enabled: false
  VersionAdded: '0.52'
  VersionChanged: '0.89'
  Include:
    - '**/*.gemspec'

Gemspec/RubyVersionGlobalsUsage:
  Description: Checks usage of RUBY_VERSION in gemspec.
  StyleGuide: '#no-ruby-version-in-the-gemspec'
  Enabled: true
  VersionAdded: '0.72'
  Include:
    - '**/*.gemspec'

#################### Layout ###########################

Layout/AccessModifierIndentation:
  Description: Check indentation of private/protected visibility modifiers.
  StyleGuide: '#indent-public-private-protected'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: indent
  SupportedStyles:
    - outdent
    - indent
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/ArgumentAlignment:
  Description: >-
                 Align the arguments of a method call if they span more
                 than one line.
  StyleGuide: '#no-double-indent'
  Enabled: true
  VersionAdded: '0.68'
  VersionChanged: '0.77'
  # Alignment of arguments in multi-line method calls.
  #
  # The `with_first_argument` style aligns the following lines along the same
  # column as the first parameter.
  #
  #     method_call(a,
  #                 b)
  #
  # The `with_fixed_indentation` style aligns the following lines with one
  # level of indentation relative to the start of the line with the method call.
  #
  #     method_call(a,
  #       b)
  EnforcedStyle: with_fixed_indentation
  SupportedStyles:
    - with_first_argument
    - with_fixed_indentation
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/ArrayAlignment:
  Description: >-
                 Align the elements of an array literal if they span more than
                 one line.
  StyleGuide: '#no-double-indent'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.77'
  # Alignment of elements of a multi-line array.
  #
  # The `with_first_parameter` style aligns the following lines along the same
  # column as the first element.
  #
  #     array = [1, 2, 3,
  #              4, 5, 6]
  #
  # The `with_fixed_indentation` style aligns the following lines with one
  # level of indentation relative to the start of the line with start of array.
  #
  #     array = [1, 2, 3,
  #       4, 5, 6]
  EnforcedStyle: with_first_element
  SupportedStyles:
    - with_first_element
    - with_fixed_indentation
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/AssignmentIndentation:
  Description: >-
                Checks the indentation of the first line of the
                right-hand-side of a multi-line assignment.
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.77'
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/BeginEndAlignment:
  Description: 'Align ends corresponding to begins correctly.'
  Enabled: true
  VersionAdded: '0.91'
  # The value `start_of_line` means that `end` should be aligned the start of the line
  # where the `begin` keyword is.
  # The value `begin` means that `end` should be aligned with the `begin` keyword.
  EnforcedStyleAlignWith: start_of_line
  SupportedStylesAlignWith:
    - start_of_line
    - begin
  Severity: warning

Layout/BlockAlignment:
  Description: 'Align block ends correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `start_of_block` means that the `end` should be aligned with line
  # where the `do` keyword appears.
  # The value `start_of_line` means it should be aligned with the whole
  # expression's starting line.
  # The value `either` means both are allowed.
  EnforcedStyleAlignWith: either
  SupportedStylesAlignWith:
    - either
    - start_of_block
    - start_of_line

Layout/BlockEndNewline:
  Description: 'Put end statement of multiline block on its own line.'
  Enabled: true
  VersionAdded: '0.49'

Layout/CaseIndentation:
  Description: 'Indentation of when in a case/(when|in)/[else/]end.'
  StyleGuide: '#indent-when-to-case'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '1.16'
  EnforcedStyle: end
  SupportedStyles:
    - case
    - end
  IndentOneStep: true
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  # This only matters if `IndentOneStep` is `true`.
  IndentationWidth: ~

Layout/ClassStructure:
  Description: 'Enforces a configured order of definitions within a class body.'
  StyleGuide: '#consistent-classes'
  Enabled: false
  VersionAdded: '0.52'
  Categories:
    module_inclusion:
      - include
      - prepend
      - extend
  ExpectedOrder:
      - module_inclusion
      - constants
      - public_class_methods
      - initializer
      - public_methods
      - protected_methods
      - private_methods

Layout/ClosingHeredocIndentation:
  Description: 'Checks the indentation of here document closings.'
  Enabled: true
  VersionAdded: '0.57'

Layout/ClosingParenthesisIndentation:
  Description: 'Checks the indentation of hanging closing parentheses.'
  Enabled: true
  VersionAdded: '0.49'

Layout/CommentIndentation:
  Description: 'Indentation of comments.'
  Enabled: true
  VersionAdded: '0.49'

Layout/ConditionPosition:
  Description: >-
                 Checks for condition placed in a confusing position relative to
                 the keyword.
  StyleGuide: '#same-line-condition'
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '0.83'

Layout/DefEndAlignment:
  Description: 'Align ends corresponding to defs correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `def` means that `end` should be aligned with the def keyword.
  # The value `start_of_line` means that `end` should be aligned with method
  # calls like `private`, `public`, etc, if present in front of the `def`
  # keyword on the same line.
  EnforcedStyleAlignWith: start_of_line
  SupportedStylesAlignWith:
    - start_of_line
    - def
  Severity: warning

Layout/DotPosition:
  Description: 'Checks the position of the dot in multi-line method calls.'
  StyleGuide: '#consistent-multi-line-chains'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: leading
  SupportedStyles:
    - leading
    - trailing

Layout/ElseAlignment:
  Description: 'Align elses and elsifs correctly.'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyComment:
  Description: 'Checks empty comment.'
  Enabled: true
  VersionAdded: '0.53'
  AllowBorderComment: true
  AllowMarginComment: true

Layout/EmptyLineAfterGuardClause:
  Description: 'Add empty line after guard clause.'
  Enabled: true
  VersionAdded: '0.56'
  VersionChanged: '0.59'

Layout/EmptyLineAfterMagicComment:
  Description: 'Add an empty line after magic comments to separate them from code.'
  StyleGuide: '#separate-magic-comments-from-code'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLineAfterMultilineCondition:
  Description: 'Enforces empty line after multiline condition.'
  # This is disabled, because this style is not very common in practice.
  Enabled: false
  VersionAdded: '0.90'
  Reference:
    - https://github.com/airbnb/ruby#multiline-if-newline

Layout/EmptyLineBetweenDefs:
  Description: 'Use empty lines between class/module/method defs.'
  StyleGuide: '#empty-lines-between-methods'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '1.7'
  EmptyLineBetweenMethodDefs: true
  EmptyLineBetweenClassDefs: true
  EmptyLineBetweenModuleDefs: true
  # If `true`, this parameter means that single line method definitions don't
  # need an empty line between them.
  AllowAdjacentOneLineDefs: false
  # Can be array to specify minimum and maximum number of empty lines, e.g. [1, 2]
  NumberOfEmptyLines: 1

Layout/EmptyLines:
  Description: "Don't use several empty lines in a row."
  StyleGuide: '#two-or-more-empty-lines'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundAccessModifier:
  Description: "Keep blank lines around access modifiers."
  StyleGuide: '#empty-lines-around-access-modifier'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: around
  SupportedStyles:
    - around
    - only_before
  Reference:
    # A reference to `EnforcedStyle: only_before`.
    - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions

Layout/EmptyLinesAroundArguments:
  Description: "Keeps track of empty lines around method arguments."
  Enabled: true
  VersionAdded: '0.52'

Layout/EmptyLinesAroundAttributeAccessor:
  Description: "Keep blank lines around attribute accessors."
  StyleGuide: '#empty-lines-around-attribute-accessor'
  Enabled: true
  VersionAdded: '0.83'
  VersionChanged: '0.84'
  AllowAliasSyntax: true
  AllowedMethods:
    - alias_method
    - public
    - protected
    - private

Layout/EmptyLinesAroundBeginBody:
  Description: "Keeps track of empty lines around begin-end bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundBlockBody:
  Description: "Keeps track of empty lines around block bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - no_empty_lines

Layout/EmptyLinesAroundClassBody:
  Description: "Keeps track of empty lines around class bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.53'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - empty_lines_except_namespace
    - empty_lines_special
    - no_empty_lines
    - beginning_only
    - ending_only

Layout/EmptyLinesAroundExceptionHandlingKeywords:
  Description: "Keeps track of empty lines around exception handling keywords."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundMethodBody:
  Description: "Keeps track of empty lines around method bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'

Layout/EmptyLinesAroundModuleBody:
  Description: "Keeps track of empty lines around module bodies."
  StyleGuide: '#empty-lines-around-bodies'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_empty_lines
  SupportedStyles:
    - empty_lines
    - empty_lines_except_namespace
    - empty_lines_special
    - no_empty_lines

Layout/EndAlignment:
  Description: 'Align ends correctly.'
  Enabled: true
  VersionAdded: '0.53'
  # The value `keyword` means that `end` should be aligned with the matching
  # keyword (`if`, `while`, etc.).
  # The value `variable` means that in assignments, `end` should be aligned
  # with the start of the variable on the left hand side of `=`. In all other
  # situations, `end` should still be aligned with the keyword.
  # The value `start_of_line` means that `end` should be aligned with the start
  # of the line which the matching keyword appears on.
  EnforcedStyleAlignWith: variable
  SupportedStylesAlignWith:
    - keyword
    - variable
    - start_of_line
  Severity: warning

Layout/EndOfLine:
  Description: 'Use Unix-style line endings.'
  StyleGuide: '#crlf'
  Enabled: true
  VersionAdded: '0.49'
  # The `native` style means that CR+LF (Carriage Return + Line Feed) is
  # enforced on Windows, and LF is enforced on other platforms. The other styles
  # mean LF and CR+LF, respectively.
  EnforcedStyle: native
  SupportedStyles:
    - native
    - lf
    - crlf

Layout/ExtraSpacing:
  Description: 'Do not use unnecessary spacing.'
  Enabled: true
  VersionAdded: '0.49'
  # When true, allows most uses of extra spacing if the intent is to align
  # things with the previous or next line, not counting empty lines or comment
  # lines.
  AllowForAlignment: true
  # When true, allows things like 'obj.meth(arg)  # comment',
  # rather than insisting on 'obj.meth(arg) # comment'.
  # If done for alignment, either this OR AllowForAlignment will allow it.
  AllowBeforeTrailingComments: false
  # When true, forces the alignment of `=` in assignments on consecutive lines.
  ForceEqualSignAlignment: false

Layout/FirstArgumentIndentation:
  Description: 'Checks the indentation of the first argument in a method call.'
  Enabled: true
  VersionAdded: '0.68'
  VersionChanged: '0.77'
  EnforcedStyle: special_for_inner_method_call_in_parentheses
  SupportedStyles:
    # The first parameter should always be indented one step more than the
    # preceding line.
    - consistent
    # The first parameter should always be indented one level relative to the
    # parent that is receiving the parameter
    - consistent_relative_to_receiver
    # The first parameter should normally be indented one step more than the
    # preceding line, but if it's a parameter for a method call that is itself
    # a parameter in a method call, then the inner parameter should be indented
    # relative to the inner method.
    - special_for_inner_method_call
    # Same as `special_for_inner_method_call` except that the special rule only
    # applies if the outer method call encloses its arguments in parentheses.
    - special_for_inner_method_call_in_parentheses
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/FirstArrayElementIndentation:
  Description: >-
                 Checks the indentation of the first element in an array
                 literal.
  Enabled: true
  VersionAdded: '0.68'
  VersionChanged: '0.77'
  # The value `special_inside_parentheses` means that array literals with
  # brackets that have their opening bracket on the same line as a surrounding
  # opening round parenthesis, shall have their first element indented relative
  # to the first position inside the parenthesis.
  #
  # The value `consistent` means that the indentation of the first element shall
  # always be relative to the first position of the line where the opening
  # bracket is.
  #
  # The value `align_brackets` means that the indentation of the first element
  # shall always be relative to the position of the opening bracket.
  EnforcedStyle: consistent
  SupportedStyles:
    - special_inside_parentheses
    - consistent
    - align_brackets
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/FirstArrayElementLineBreak:
  Description: >-
                 Checks for a line break before the first element in a
                 multi-line array.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstHashElementIndentation:
  Description: 'Checks the indentation of the first key in a hash literal.'
  Enabled: true
  VersionAdded: '0.68'
  VersionChanged: '0.77'
  # The value `special_inside_parentheses` means that hash literals with braces
  # that have their opening brace on the same line as a surrounding opening
  # round parenthesis, shall have their first key indented relative to the
  # first position inside the parenthesis.
  #
  # The value `consistent` means that the indentation of the first key shall
  # always be relative to the first position of the line where the opening
  # brace is.
  #
  # The value `align_braces` means that the indentation of the first key shall
  # always be relative to the position of the opening brace.
  EnforcedStyle: consistent
  SupportedStyles:
    - special_inside_parentheses
    - consistent
    - align_braces
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/FirstHashElementLineBreak:
  Description: >-
                 Checks for a line break before the first element in a
                 multi-line hash.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstMethodArgumentLineBreak:
  Description: >-
                 Checks for a line break before the first argument in a
                 multi-line method call.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstMethodParameterLineBreak:
  Description: >-
                 Checks for a line break before the first parameter in a
                 multi-line method parameter definition.
  Enabled: false
  VersionAdded: '0.49'

Layout/FirstParameterIndentation:
  Description: >-
                 Checks the indentation of the first parameter in a
                 method definition.
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.77'
  EnforcedStyle: consistent
  SupportedStyles:
    - consistent
    - align_parentheses
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/HashAlignment:
  Description: >-
    Align the elements of a hash literal if they span more than
    one line.
  Enabled: true
  AllowMultipleStyles: true
  VersionAdded: '0.49'
  VersionChanged: '1.16'
  # Alignment of entries using hash rocket as separator. Valid values are:
  #
  # key - left alignment of keys
  #   'a' => 2
  #   'bb' => 3
  # separator - alignment of hash rockets, keys are right aligned
  #    'a' => 2
  #   'bb' => 3
  # table - left alignment of keys, hash rockets, and values
  #   'a'  => 2
  #   'bb' => 3
  EnforcedHashRocketStyle: key
  SupportedHashRocketStyles:
    - key
    - separator
    - table
  # Alignment of entries using colon as separator. Valid values are:
  #
  # key - left alignment of keys
  #   a: 0
  #   bb: 1
  # separator - alignment of colons, keys are right aligned
  #    a: 0
  #   bb: 1
  # table - left alignment of keys and values
  #   a:  0
  #   bb: 1
  EnforcedColonStyle: key
  SupportedColonStyles:
    - key
    - separator
    - table
  # Select whether hashes that are the last argument in a method call should be
  # inspected? Valid values are:
  #
  # always_inspect - Inspect both implicit and explicit hashes.
  #   Registers an offense for:
  #     function(a: 1,
  #       b: 2)
  #   Registers an offense for:
  #     function({a: 1,
  #       b: 2})
  # always_ignore - Ignore both implicit and explicit hashes.
  #   Accepts:
  #     function(a: 1,
  #       b: 2)
  #   Accepts:
  #     function({a: 1,
  #       b: 2})
  # ignore_implicit - Ignore only implicit hashes.
  #   Accepts:
  #     function(a: 1,
  #       b: 2)
  #   Registers an offense for:
  #     function({a: 1,
  #       b: 2})
  # ignore_explicit - Ignore only explicit hashes.
  #   Accepts:
  #     function({a: 1,
  #       b: 2})
  #   Registers an offense for:
  #     function(a: 1,
  #       b: 2)
  EnforcedLastArgumentHashStyle: always_inspect
  SupportedLastArgumentHashStyles:
    - always_inspect
    - always_ignore
    - ignore_implicit
    - ignore_explicit

Layout/HeredocArgumentClosingParenthesis:
  Description: >-
                 Checks for the placement of the closing parenthesis in a
                 method call that passes a HEREDOC string as an argument.
  Enabled: false
  StyleGuide: '#heredoc-argument-closing-parentheses'
  VersionAdded: '0.68'

Layout/HeredocIndentation:
  Description: 'This cop checks the indentation of the here document bodies.'
  StyleGuide: '#squiggly-heredocs'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.85'

Layout/IndentationConsistency:
  Description: 'Keep indentation straight.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  # The difference between `indented` and `normal` is that the `indented_internal_methods`
  # style prescribes that in classes and modules the `protected` and `private`
  # modifier keywords shall be indented the same as public methods and that
  # protected and private members shall be indented one step more than the
  # modifiers. Other than that, both styles mean that entities on the same
  # logical depth shall have the same indentation.
  EnforcedStyle: indented_internal_methods
  SupportedStyles:
    - normal
    - indented_internal_methods
  Reference:
    # A reference to `EnforcedStyle: indented_internal_methods`.
    - https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions

Layout/IndentationStyle:
  Description: 'Consistent indentation either with tabs only or spaces only.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.82'
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  # It is used during auto-correction to determine how many spaces should
  # replace each tab.
  IndentationWidth: ~
  EnforcedStyle: spaces
  SupportedStyles:
    - spaces
    - tabs

Layout/IndentationWidth:
  Description: 'Use 2 spaces for indentation.'
  StyleGuide: '#spaces-indentation'
  Enabled: true
  VersionAdded: '0.49'
  # Number of spaces for each indentation level.
  Width: 2
  IgnoredPatterns: []

Layout/InitialIndentation:
  Description: >-
    Checks the indentation of the first non-blank non-comment line in a file.
  Enabled: true
  VersionAdded: '0.49'

Layout/LeadingCommentSpace:
  Description: 'Comments should start with a space.'
  StyleGuide: '#hash-space'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.73'
  AllowDoxygenCommentStyle: false
  AllowGemfileRubyComment: false

Layout/LeadingEmptyLines:
  Description: Check for unnecessary blank lines at the beginning of a file.
  Enabled: true
  VersionAdded: '0.57'
  VersionChanged: '0.77'

Layout/LineEndStringConcatenationIndentation:
  Description: >-
                 Checks the indentation of the next line after a line that
                 ends with a string literal and a backslash.
  Enabled: true
  VersionAdded: '1.18'
  EnforcedStyle: aligned
  SupportedStyles:
    - aligned
    - indented
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/LineLength:
  Description: 'Checks that line length does not exceed the configured limit.'
  StyleGuide: '#max-line-length'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '1.4'
  AutoCorrect: true
  Max: 300
  # To make it possible to copy or click on URIs in the code, we allow lines
  # containing a URI to be longer than Max.
  AllowHeredoc: true
  AllowURI: true
  URISchemes:
    - http
    - https
  # The IgnoreCopDirectives option causes the LineLength rule to ignore cop
  # directives like '# rubocop: enable ...' when calculating a line's length.
  IgnoreCopDirectives: true
  # The IgnoredPatterns option is a list of !ruby/regexp and/or string
  # elements. Strings will be converted to Regexp objects. A line that matches
  # any regular expression listed in this option will be ignored by LineLength.
  IgnoredPatterns: []

Layout/MultilineArrayBraceLayout:
  Description: >-
                 Checks that the closing brace in an array literal is
                 either on the same line as the last array element, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last element
    - symmetrical
    - new_line
    - same_line

Layout/MultilineArrayLineBreaks:
  Description: >-
                 Checks that each item in a multi-line array literal
                 starts on a separate line.
  Enabled: false
  VersionAdded: '0.67'

Layout/MultilineAssignmentLayout:
  Description: 'Check for a newline after the assignment operator in multi-line assignments.'
  StyleGuide: '#indent-conditional-assignment'
  Enabled: false
  VersionAdded: '0.49'
  # The types of assignments which are subject to this rule.
  SupportedTypes:
    - block
    - case
    - class
    - if
    - kwbegin
    - module
  EnforcedStyle: new_line
  SupportedStyles:
    # Ensures that the assignment operator and the rhs are on the same line for
    # the set of supported types.
    - same_line
    # Ensures that the assignment operator and the rhs are on separate lines
    # for the set of supported types.
    - new_line

Layout/MultilineBlockLayout:
  Description: 'Ensures newlines after multiline block do statements.'
  Enabled: true
  VersionAdded: '0.49'

Layout/MultilineHashBraceLayout:
  Description: >-
                 Checks that the closing brace in a hash literal is
                 either on the same line as the last hash element, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on same line as last element
    - symmetrical
    - new_line
    - same_line

Layout/MultilineHashKeyLineBreaks:
  Description: >-
                 Checks that each item in a multi-line hash literal
                 starts on a separate line.
  Enabled: false
  VersionAdded: '0.67'

Layout/MultilineMethodArgumentLineBreaks:
  Description: >-
                 Checks that each argument in a multi-line method call
                 starts on a separate line.
  Enabled: false
  VersionAdded: '0.67'

Layout/MultilineMethodCallBraceLayout:
  Description: >-
                 Checks that the closing brace in a method call is
                 either on the same line as the last method argument, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last argument
    - symmetrical
    - new_line
    - same_line

Layout/MultilineMethodCallIndentation:
  Description: >-
                 Checks indentation of method calls with the dot operator
                 that span more than one line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: indented
  SupportedStyles:
    - aligned
    - indented
    - indented_relative_to_receiver
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/MultilineMethodDefinitionBraceLayout:
  Description: >-
                 Checks that the closing brace in a method definition is
                 either on the same line as the last method parameter, or
                 a new line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: symmetrical
  SupportedStyles:
    # symmetrical: closing brace is positioned in same way as opening brace
    # new_line: closing brace is always on a new line
    # same_line: closing brace is always on the same line as last parameter
    - symmetrical
    - new_line
    - same_line

Layout/MultilineOperationIndentation:
  Description: >-
                 Checks indentation of binary operations that span more than
                 one line.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: indented
  SupportedStyles:
    - aligned
    - indented
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/ParameterAlignment:
  Description: >-
                 Align the parameters of a method definition if they span more
                 than one line.
  StyleGuide: '#no-double-indent'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.77'
  # Alignment of parameters in multi-line method calls.
  #
  # The `with_first_parameter` style aligns the following lines along the same
  # column as the first parameter.
  #
  #     def method_foo(a,
  #                    b)
  #
  # The `with_fixed_indentation` style aligns the following lines with one
  # level of indentation relative to the start of the line with the method call.
  #
  #     def method_foo(a,
  #       b)
  EnforcedStyle: with_first_parameter
  SupportedStyles:
    - with_first_parameter
    - with_fixed_indentation
  # By default the indentation width from `Layout/IndentationWidth` is used,
  # but it can be overridden by setting this parameter.
  IndentationWidth: ~

Layout/RedundantLineBreak:
  Description: >-
                 Do not break up an expression into multiple lines when it fits
                 on a single line.
  Enabled: true
  InspectBlocks: false
  VersionAdded: '1.13'

Layout/RescueEnsureAlignment:
  Description: 'Align rescues and ensures correctly.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SingleLineBlockChain:
  Description: 'Put method call on a separate line if chained to a single line block.'
  Enabled: true
  VersionAdded: '1.14'

Layout/SpaceAfterColon:
  Description: 'Use spaces after colons.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterComma:
  Description: 'Use spaces after commas.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterMethodName:
  Description: >-
                 Do not put a space between a method name and the opening
                 parenthesis in a method definition.
  StyleGuide: '#parens-no-spaces'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterNot:
  Description: Tracks redundant space after the ! operator.
  StyleGuide: '#no-space-bang'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAfterSemicolon:
  Description: 'Use spaces after semicolons.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAroundBlockParameters:
  Description: 'Checks the spacing inside and after block parameters pipes.'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyleInsidePipes: no_space
  SupportedStylesInsidePipes:
    - space
    - no_space

Layout/SpaceAroundEqualsInParameterDefault:
  Description: >-
                 Checks that the equals signs in parameter default assignments
                 have or don't have surrounding space depending on
                 configuration.
  StyleGuide: '#spaces-around-equals'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space

Layout/SpaceAroundKeyword:
  Description: 'Use a space around keywords if appropriate.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceAroundMethodCallOperator:
  Description: 'Checks method call operators to not have spaces around them.'
  Enabled: true
  VersionAdded: '0.82'

Layout/SpaceAroundOperators:
  Description: 'Use a single space around operators.'
  StyleGuide: '#spaces-operators'
  Enabled: true
  VersionAdded: '0.49'
  # When `true`, allows most uses of extra spacing if the intent is to align
  # with an operator on the previous or next line, not counting empty lines
  # or comment lines.
  AllowForAlignment: true
  EnforcedStyleForExponentOperator: space
  SupportedStylesForExponentOperator:
    - space
    - no_space

Layout/SpaceBeforeBlockBraces:
  Description: >-
                 Checks that the left block brace has or doesn't have space
                 before it.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBraces: space
  SupportedStylesForEmptyBraces:
    - space
    - no_space
  VersionChanged: '0.52'

Layout/SpaceBeforeBrackets:
  Description: 'Checks for receiver with a space before the opening brackets.'
  StyleGuide: '#space-in-brackets-access'
  Enabled: true
  VersionAdded: '1.7'

Layout/SpaceBeforeComma:
  Description: 'No spaces before commas.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceBeforeComment:
  Description: >-
                 Checks for missing space between code and a comment on the
                 same line.
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceBeforeFirstArg:
  Description: >-
                 Checks that exactly one space is used between a method name
                 and the first argument for method calls without parentheses.
  Enabled: true
  VersionAdded: '0.49'
  # When `true`, allows most uses of extra spacing if the intent is to align
  # things with the previous or next line, not counting empty lines or comment
  # lines.
  AllowForAlignment: true

Layout/SpaceBeforeSemicolon:
  Description: 'No spaces before semicolons.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInLambdaLiteral:
  Description: 'Checks for spaces in lambda literals.'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: require_no_space
  SupportedStyles:
    - require_no_space
    - require_space

Layout/SpaceInsideArrayLiteralBrackets:
  Description: 'Checks the spacing inside array literal brackets.'
  Enabled: true
  VersionAdded: '0.52'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space
    # 'compact' normally requires a space inside the brackets, with the exception
    # that successive left brackets or right brackets are collapsed together
    - compact
  EnforcedStyleForEmptyBrackets: no_space
  SupportedStylesForEmptyBrackets:
    - space
    - no_space

Layout/SpaceInsideArrayPercentLiteral:
  Description: 'No unnecessary additional spaces between elements in %i/%w literals.'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInsideBlockBraces:
  Description: >-
                 Checks that block braces have or don't have surrounding space.
                 For blocks taking parameters, checks that the left brace has
                 or doesn't have trailing space.
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBraces: no_space
  SupportedStylesForEmptyBraces:
    - space
    - no_space
  # Space between `{` and `|`. Overrides `EnforcedStyle` if there is a conflict.
  SpaceBeforeBlockParameters: true

Layout/SpaceInsideHashLiteralBraces:
  Description: "Use spaces inside hash literal braces - or don't."
  StyleGuide: '#spaces-braces'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: space
  SupportedStyles:
    - space
    - no_space
    # 'compact' normally requires a space inside hash braces, with the exception
    # that successive left braces or right braces are collapsed together
    - compact
  EnforcedStyleForEmptyBraces: no_space
  SupportedStylesForEmptyBraces:
    - space
    - no_space


Layout/SpaceInsideParens:
  Description: 'No spaces after ( or before ).'
  StyleGuide: '#spaces-braces'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.55'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space

Layout/SpaceInsidePercentLiteralDelimiters:
  Description: 'No unnecessary spaces inside delimiters of %i/%w/%x literals.'
  Enabled: false
  VersionAdded: '0.49'

Layout/SpaceInsideRangeLiteral:
  Description: 'No spaces inside range literals.'
  StyleGuide: '#no-space-inside-range-literals'
  Enabled: true
  VersionAdded: '0.49'

Layout/SpaceInsideReferenceBrackets:
  Description: 'Checks the spacing inside referential brackets.'
  Enabled: true
  VersionAdded: '0.52'
  VersionChanged: '0.53'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space
  EnforcedStyleForEmptyBrackets: no_space
  SupportedStylesForEmptyBrackets:
    - space
    - no_space

Layout/SpaceInsideStringInterpolation:
  Description: 'Checks for padding/surrounding spaces inside string interpolation.'
  StyleGuide: '#string-interpolation'
  Enabled: true
  VersionAdded: '0.49'
  EnforcedStyle: no_space
  SupportedStyles:
    - space
    - no_space

Layout/TrailingEmptyLines:
  Description: 'Checks trailing blank lines and final newline.'
  StyleGuide: '#newline-eof'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.77'
  EnforcedStyle: final_newline
  SupportedStyles:
    - final_newline
    - final_blank_line

Layout/TrailingWhitespace:
  Description: 'Avoid trailing whitespace.'
  StyleGuide: '#no-trailing-whitespace'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '1.0'
  AllowInHeredoc: false

#################### Lint ##################################
### Warnings

Lint/AmbiguousAssignment:
  Description: 'Checks for mistyped shorthand assignments.'
  Enabled: true
  VersionAdded: '1.7'

Lint/AmbiguousBlockAssociation:
  Description: >-
                 Checks for ambiguous block association with method when param passed without
                 parentheses.
  StyleGuide: '#syntax'
  Enabled: true
  VersionAdded: '0.48'
  VersionChanged: '1.13'
  IgnoredMethods: []

Lint/AmbiguousOperator:
  Description: >-
                 Checks for ambiguous operators in the first argument of a
                 method invocation without parentheses.
  StyleGuide: '#method-invocation-parens'
  Enabled: true
  VersionAdded: '0.17'
  VersionChanged: '0.83'

Lint/AmbiguousRange:
  Description: Checks for ranges with ambiguous boundaries.
  Enabled: true
  VersionAdded: '1.19'
  SafeAutoCorrect: false
  RequireParenthesesForMethodChains: false

Lint/AmbiguousRegexpLiteral:
  Description: >-
                 Checks for ambiguous regexp literals in the first argument of
                 a method invocation without parentheses.
  Enabled: true
  VersionAdded: '0.17'
  VersionChanged: '0.83'

Lint/AssignmentInCondition:
  Description: "Don't use assignment in conditions."
  StyleGuide: '#safe-assignment-in-condition'
  Enabled: true
  VersionAdded: '0.9'
  AllowSafeAssignment: true

Lint/BigDecimalNew:
  Description: '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.'
  Enabled: true
  VersionAdded: '0.53'

Lint/BinaryOperatorWithIdenticalOperands:
  Description: 'This cop checks for places where binary operator has identical operands.'
  Enabled: true
  Safe: false
  VersionAdded: '0.89'
  VersionChanged: '1.7'

Lint/BooleanSymbol:
  Description: 'Check for `:true` and `:false` symbols.'
  Enabled: true
  Safe: false
  VersionAdded: '0.50'
  VersionChanged: '0.83'

Lint/CircularArgumentReference:
  Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument."
  Enabled: true
  VersionAdded: '0.33'

Lint/ConstantDefinitionInBlock:
  Description: 'Do not define constants within a block.'
  StyleGuide: '#no-constant-definition-in-block'
  Enabled: true
  VersionAdded: '0.91'
  VersionChanged: '1.3'
  # `enums` for Typed Enums via T::Enum in Sorbet.
  # https://sorbet.org/docs/tenum
  AllowedMethods:
    - enums

Lint/ConstantResolution:
  Description: 'Check that constants are fully qualified with `::`.'
  Enabled: false
  VersionAdded: '0.86'
  # Restrict this cop to only looking at certain names
  Only: []
  # Restrict this cop from only looking at certain names
  Ignore: []

Lint/Debugger:
  Description: 'Check for debugger calls.'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '1.10'
  DebuggerMethods:
    # Groups are available so that a specific group can be disabled in
    # a user's configuration, but are otherwise not significant.
    Kernel:
      - binding.irb
    Byebug:
      - byebug
      - remote_byebug
      - Kernel.byebug
      - Kernel.remote_byebug
    Capybara:
      - save_and_open_page
      - save_and_open_screenshot
    debug.rb:
      - binding.b
      - binding.break
      - Kernel.binding.b
      - Kernel.binding.break
    Pry:
      - binding.pry
      - binding.remote_pry
      - binding.pry_remote
      - Pry.rescue
    Rails:
      - debugger
      - Kernel.debugger
    RubyJard:
      - jard
    WebConsole:
      - binding.console

Lint/DeprecatedClassMethods:
  Description: 'Check for deprecated class method calls.'
  Enabled: true
  VersionAdded: '0.19'

Lint/DeprecatedConstants:
  Description: 'Checks for deprecated constants.'
  Enabled: true
  VersionAdded: '1.8'
  # You can configure deprecated constants.
  # If there is an alternative method, you can set alternative value as `Alternative`.
  # And you can set the deprecated version as `DeprecatedVersion`.
  # These options can be omitted if they are not needed.
  #
  # DeprecatedConstants:
  #   'DEPRECATED_CONSTANT':
  #     Alternative: 'alternative_value'
  #     DeprecatedVersion: 'deprecated_version'
  #
  DeprecatedConstants:
    'NIL':
      Alternative: 'nil'
      DeprecatedVersion: '2.4'
    'TRUE':
      Alternative: 'true'
      DeprecatedVersion: '2.4'
    'FALSE':
      Alternative: 'false'
      DeprecatedVersion: '2.4'
    'Random::DEFAULT':
      Alternative: 'Random.new'
      DeprecatedVersion: '3.0'

Lint/DeprecatedOpenSSLConstant:
  Description: "Don't use algorithm constants for `OpenSSL::Cipher` and `OpenSSL::Digest`."
  Enabled: true
  VersionAdded: '0.84'

Lint/DisjunctiveAssignmentInConstructor:
  Description: 'In constructor, plain assignment is preferred over disjunctive.'
  Enabled: true
  Safe: false
  VersionAdded: '0.62'
  VersionChanged: '0.88'

Lint/DuplicateBranch:
  Description: Checks that there are no repeated bodies within `if/unless`, `case-when` and `rescue` constructs.
  Enabled: true
  VersionAdded: '1.3'
  VersionChanged: '1.7'
  IgnoreLiteralBranches: false
  IgnoreConstantBranches: false

Lint/DuplicateCaseCondition:
  Description: 'Do not repeat values in case conditionals.'
  Enabled: true
  VersionAdded: '0.45'

Lint/DuplicateElsifCondition:
  Description: 'Do not repeat conditions used in if `elsif`.'
  Enabled: true
  VersionAdded: '0.88'

Lint/DuplicateHashKey:
  Description: 'Check for duplicate keys in hash literals.'
  Enabled: true
  VersionAdded: '0.34'
  VersionChanged: '0.77'

Lint/DuplicateMethods:
  Description: 'Check for duplicate method definitions.'
  Enabled: true
  VersionAdded: '0.29'

Lint/DuplicateRegexpCharacterClassElement:
  Description: 'Checks for duplicate elements in Regexp character classes.'
  Enabled: true
  VersionAdded: '1.1'

Lint/DuplicateRequire:
  Description: 'Check for duplicate `require`s and `require_relative`s.'
  Enabled: true
  VersionAdded: '0.90'

Lint/DuplicateRescueException:
  Description: 'Checks that there are no repeated exceptions used in `rescue` expressions.'
  Enabled: true
  VersionAdded: '0.89'

Lint/EachWithObjectArgument:
  Description: 'Check for immutable argument given to each_with_object.'
  Enabled: true
  VersionAdded: '0.31'

Lint/ElseLayout:
  Description: 'Check for odd code arrangement in an else block.'
  Enabled: true
  VersionAdded: '0.17'
  VersionChanged: '1.2'

Lint/EmptyBlock:
  Description: 'This cop checks for blocks without a body.'
  Enabled: true
  VersionAdded: '1.1'
  VersionChanged: '1.3'
  AllowComments: true
  AllowEmptyLambdas: true

Lint/EmptyClass:
  Description: 'Checks for classes and metaclasses without a body.'
  Enabled: true
  VersionAdded: '1.3'
  AllowComments: false

Lint/EmptyConditionalBody:
  Description: 'This cop checks for the presence of `if`, `elsif` and `unless` branches without a body.'
  Enabled: true
  AllowComments: true
  VersionAdded: '0.89'

Lint/EmptyEnsure:
  Description: 'Checks for empty ensure block.'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.48'

Lint/EmptyExpression:
  Description: 'Checks for empty expressions.'
  Enabled: true
  VersionAdded: '0.45'

Lint/EmptyFile:
  Description: 'Enforces that Ruby source files are not empty.'
  Enabled: true
  AllowComments: true
  VersionAdded: '0.90'

Lint/EmptyInPattern:
  Description: 'Checks for the presence of `in` pattern branches without a body.'
  Enabled: true
  AllowComments: true
  VersionAdded: '1.16'

Lint/EmptyInterpolation:
  Description: 'Checks for empty string interpolation.'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.45'

Lint/EmptyWhen:
  Description: 'Checks for `when` branches with empty bodies.'
  Enabled: true
  AllowComments: true
  VersionAdded: '0.45'
  VersionChanged: '0.83'

Lint/EnsureReturn:
  Description: 'Do not use return in an ensure block.'
  StyleGuide: '#no-return-ensure'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.83'

Lint/ErbNewArguments:
  Description: 'Use `:trim_mode` and `:eoutvar` keyword arguments to `ERB.new`.'
  Enabled: true
  VersionAdded: '0.56'

Lint/FlipFlop:
  Description: 'Checks for flip-flops.'
  StyleGuide: '#no-flip-flops'
  Enabled: true
  VersionAdded: '0.16'

Lint/FloatComparison:
  Description: 'Checks for the presence of precise comparison of floating point numbers.'
  StyleGuide: '#float-comparison'
  Enabled: true
  VersionAdded: '0.89'

Lint/FloatOutOfRange:
  Description: >-
                 Catches floating-point literals too large or small for Ruby to
                 represent.
  Enabled: true
  VersionAdded: '0.36'

Lint/FormatParameterMismatch:
  Description: 'The number of parameters to format/sprint must match the fields.'
  Enabled: true
  VersionAdded: '0.33'

Lint/HashCompareByIdentity:
  Description: 'Prefer using `Hash#compare_by_identity` than using `object_id` for keys.'
  StyleGuide: '#identity-comparison'
  Enabled: true
  Safe: false
  VersionAdded: '0.93'

Lint/HeredocMethodCallPosition:
  Description: >-
                 Checks for the ordering of a method call where
                 the receiver of the call is a HEREDOC.
  Enabled: false
  StyleGuide: '#heredoc-method-calls'
  VersionAdded: '0.68'

Lint/IdentityComparison:
  Description: 'Prefer `equal?` over `==` when comparing `object_id`.'
  Enabled: true
  StyleGuide: '#identity-comparison'
  VersionAdded: '0.91'

Lint/ImplicitStringConcatenation:
  Description: >-
                 Checks for adjacent string literals on the same line, which
                 could better be represented as a single string literal.
  Enabled: true
  VersionAdded: '0.36'

Lint/IneffectiveAccessModifier:
  Description: >-
                 Checks for attempts to use `private` or `protected` to set
                 the visibility of a class method, which does not work.
  Enabled: true
  VersionAdded: '0.36'

Lint/InheritException:
  Description: 'Avoid inheriting from the `Exception` class.'
  Enabled: true
  VersionAdded: '0.41'
  # The default base class in favour of `Exception`.
  EnforcedStyle: runtime_error
  SupportedStyles:
    - runtime_error
    - standard_error

Lint/InterpolationCheck:
  Description: 'Raise warning for interpolation in single q strs.'
  Enabled: true
  Safe: false
  VersionAdded: '0.50'
  VersionChanged: '0.87'

Lint/LambdaWithoutLiteralBlock:
  Description: 'Checks uses of lambda without a literal block.'
  Enabled: true
  VersionAdded: '1.8'

Lint/LiteralAsCondition:
  Description: 'Checks of literals used in conditions.'
  Enabled: true
  VersionAdded: '0.51'

Lint/LiteralInInterpolation:
  Description: 'Checks for literals used in interpolation.'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.32'

Lint/Loop:
  Description: >-
                 Use Kernel#loop with break rather than begin/end/until or
                 begin/end/while for post-loop tests.
  StyleGuide: '#loop-with-break'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '1.3'
  Safe: false

Lint/MissingCopEnableDirective:
  Description: 'Checks for a `# rubocop:enable` after `# rubocop:disable`.'
  Enabled: true
  VersionAdded: '0.52'
  # Maximum number of consecutive lines the cop can be disabled for.
  # 0 allows only single-line disables
  # 1 would mean the maximum allowed is the following:
  #   # rubocop:disable SomeCop
  #   a = 1
  #   # rubocop:enable SomeCop
  # .inf for any size
  MaximumRangeSize: .inf

Lint/MissingSuper:
  Description: >-
                  This cop checks for the presence of constructors and lifecycle callbacks
                  without calls to `super`.
  Enabled: true
  VersionAdded: '0.89'
  VersionChanged: '1.4'

Lint/MixedRegexpCaptureTypes:
  Description: 'Do not mix named captures and numbered captures in a Regexp literal.'
  Enabled: true
  VersionAdded: '0.85'

Lint/MultipleComparison:
  Description: "Use `&&` operator to compare multiple values."
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '1.1'

Lint/NestedMethodDefinition:
  Description: 'Do not use nested method definitions.'
  StyleGuide: '#no-nested-methods'
  Enabled: true
  VersionAdded: '0.32'

Lint/NestedPercentLiteral:
  Description: 'Checks for nested percent literals.'
  Enabled: true
  VersionAdded: '0.52'

Lint/NextWithoutAccumulator:
  Description:  >-
                  Do not omit the accumulator when calling `next`
                  in a `reduce`/`inject` block.
  Enabled: true
  VersionAdded: '0.36'

Lint/NoReturnInBeginEndBlocks:
  Description: 'Do not `return` inside `begin..end` blocks in assignment contexts.'
  Enabled: true
  VersionAdded: '1.2'

Lint/NonDeterministicRequireOrder:
  Description: 'Always sort arrays returned by Dir.glob when requiring files.'
  Enabled: true
  VersionAdded: '0.78'
  Safe: false

Lint/NonLocalExitFromIterator:
  Description: 'Do not use return in iterator to cause non-local exit.'
  Enabled: true
  VersionAdded: '0.30'

Lint/NumberConversion:
  Description: 'Checks unsafe usage of number conversion methods.'
  Enabled: false
  VersionAdded: '0.53'
  VersionChanged: '1.1'
  SafeAutoCorrect: false
  IgnoredMethods: []
  IgnoredClasses:
    - Time
    - DateTime

Lint/NumberedParameterAssignment:
  Description: 'Checks for uses of numbered parameter assignment.'
  Enabled: true
  VersionAdded: '1.9'

Lint/OrAssignmentToConstant:
  Description: 'Checks unintended or-assignment to constant.'
  Enabled: true
  Safe: false
  VersionAdded: '1.9'

Lint/OrderedMagicComments:
  Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.'
  Enabled: true
  VersionAdded: '0.53'

Lint/OutOfRangeRegexpRef:
  Description: 'Checks for out of range reference for Regexp because it always returns nil.'
  Enabled: true
  Safe: false
  VersionAdded: '0.89'

Lint/ParenthesesAsGroupedExpression:
  Description: >-
                 Checks for method calls with a space before the opening
                 parenthesis.
  StyleGuide: '#parens-no-spaces'
  Enabled: true
  VersionAdded: '0.12'
  VersionChanged: '0.83'

Lint/PercentStringArray:
  Description: >-
                 Checks for unwanted commas and quotes in %w/%W literals.
  Enabled: true
  Safe: false
  VersionAdded: '0.41'

Lint/PercentSymbolArray:
  Description: >-
                 Checks for unwanted commas and colons in %i/%I literals.
  Enabled: true
  VersionAdded: '0.41'

Lint/RaiseException:
  Description: Checks for `raise` or `fail` statements which are raising `Exception` class.
  StyleGuide: '#raise-exception'
  Enabled: true
  Safe: false
  VersionAdded: '0.81'
  VersionChanged: '0.86'
  AllowedImplicitNamespaces:
    - 'Gem'

Lint/RandOne:
  Description: >-
                 Checks for `rand(1)` calls. Such calls always return `0`
                 and most likely a mistake.
  Enabled: true
  VersionAdded: '0.36'

Lint/RedundantCopDisableDirective:
  Description: >-
                 Checks for rubocop:disable comments that can be removed.
                 Note: this cop is not disabled when disabling all cops.
                 It must be explicitly disabled.
  Enabled: true
  VersionAdded: '0.76'

Lint/RedundantCopEnableDirective:
  Description: Checks for rubocop:enable comments that can be removed.
  Enabled: true
  VersionAdded: '0.76'

Lint/RedundantDirGlobSort:
  Description: 'Checks for redundant `sort` method to `Dir.glob` and `Dir[]`.'
  Enabled: true
  VersionAdded: '1.8'

Lint/RedundantRequireStatement:
  Description: 'Checks for unnecessary `require` statement.'
  Enabled: true
  VersionAdded: '0.76'

Lint/RedundantSafeNavigation:
  Description: 'Checks for redundant safe navigation calls.'
  Enabled: true
  VersionAdded: '0.93'
  AllowedMethods:
    - instance_of?
    - kind_of?
    - is_a?
    - eql?
    - respond_to?
    - equal?
  Safe: false

Lint/RedundantSplatExpansion:
  Description: 'Checks for splat unnecessarily being called on literals.'
  Enabled: true
  VersionAdded: '0.76'
  VersionChanged: '1.7'
  AllowPercentLiteralArrayArgument: true

Lint/RedundantStringCoercion:
  Description: 'Checks for Object#to_s usage in string interpolation.'
  StyleGuide: '#no-to-s'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.77'

Lint/RedundantWithIndex:
  Description: 'Checks for redundant `with_index`.'
  Enabled: true
  VersionAdded: '0.50'

Lint/RedundantWithObject:
  Description: 'Checks for redundant `with_object`.'
  Enabled: true
  VersionAdded: '0.51'

Lint/RegexpAsCondition:
  Description: >-
                 Do not use regexp literal as a condition.
                 The regexp literal matches `$_` implicitly.
  Enabled: true
  VersionAdded: '0.51'
  VersionChanged: '0.86'

Lint/RequireParentheses:
  Description: >-
                 Use parentheses in the method call to avoid confusion
                 about precedence.
  Enabled: true
  VersionAdded: '0.18'

Lint/RescueException:
  Description: 'Avoid rescuing the Exception class.'
  StyleGuide: '#no-blind-rescues'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.27'

Lint/RescueType:
  Description: 'Avoid rescuing from non constants that could result in a `TypeError`.'
  Enabled: true
  VersionAdded: '0.49'

Lint/ReturnInVoidContext:
  Description: 'Checks for return in void context.'
  Enabled: true
  VersionAdded: '0.50'

Lint/SafeNavigationChain:
  Description: 'Do not chain ordinary method call after safe navigation operator.'
  Enabled: true
  VersionAdded: '0.47'
  VersionChanged: '0.77'
  AllowedMethods:
    - present?
    - blank?
    - presence
    - try
    - try!
    - in?

Lint/SafeNavigationConsistency:
  Description: >-
                 Check to make sure that if safe navigation is used for a method
                 call in an `&&` or `||` condition that safe navigation is used
                 for all method calls on that same object.
  Enabled: true
  VersionAdded: '0.55'
  VersionChanged: '0.77'
  AllowedMethods:
    - present?
    - blank?
    - presence
    - try
    - try!

Lint/SafeNavigationWithEmpty:
  Description: 'Avoid `foo&.empty?` in conditionals.'
  Enabled: true
  VersionAdded: '0.62'
  VersionChanged: '0.87'

Lint/ScriptPermission:
  Description: 'Grant script file execute permission.'
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '0.50'

Lint/SelfAssignment:
  Description: 'Checks for self-assignments.'
  Enabled: true
  VersionAdded: '0.89'

Lint/SendWithMixinArgument:
  Description: 'Checks for `send` method when using mixin.'
  Enabled: true
  VersionAdded: '0.75'

Lint/ShadowedArgument:
  Description: 'Avoid reassigning arguments before they were used.'
  Enabled: true
  VersionAdded: '0.52'
  IgnoreImplicitReferences: false


Lint/ShadowedException:
  Description: >-
                  Avoid rescuing a higher level exception
                  before a lower level exception.
  Enabled: true
  VersionAdded: '0.41'

Lint/ShadowingOuterLocalVariable:
  Description: >-
                 Do not use the same name as outer local variable
                 for block arguments or block local variables.
  Enabled: true
  VersionAdded: '0.9'

Lint/StructNewOverride:
  Description: 'Disallow overriding the `Struct` built-in methods via `Struct.new`.'
  Enabled: true
  VersionAdded: '0.81'

Lint/SuppressedException:
  Description: "Don't suppress exceptions."
  StyleGuide: '#dont-hide-exceptions'
  Enabled: true
  AllowComments: true
  AllowNil: true
  VersionAdded: '0.9'
  VersionChanged: '1.12'

Lint/SymbolConversion:
  Description: 'Checks for unnecessary symbol conversions.'
  Enabled: true
  VersionAdded: '1.9'
  VersionChanged: '1.16'
  EnforcedStyle: strict
  SupportedStyles:
    - strict
    - consistent

Lint/Syntax:
  Description: 'Checks for syntax errors.'
  Enabled: true
  VersionAdded: '0.9'

Lint/ToEnumArguments:
  Description: 'This cop ensures that `to_enum`/`enum_for`, called for the current method, has correct arguments.'
  Enabled: true
  VersionAdded: '1.1'

Lint/ToJSON:
  Description: 'Ensure #to_json includes an optional argument.'
  Enabled: true
  VersionAdded: '0.66'

Lint/TopLevelReturnWithArgument:
  Description: 'This cop detects top level return statements with argument.'
  Enabled: true
  VersionAdded: '0.89'

Lint/TrailingCommaInAttributeDeclaration:
  Description: 'This cop checks for trailing commas in attribute declarations.'
  Enabled: true
  VersionAdded: '0.90'

Lint/TripleQuotes:
  Description: 'Checks for useless triple quote constructs.'
  Enabled: true
  VersionAdded: '1.9'

Lint/UnderscorePrefixedVariableName:
  Description: 'Do not use prefix `_` for a variable that is used.'
  Enabled: true
  VersionAdded: '0.21'
  AllowKeywordBlockArguments: false

Lint/UnexpectedBlockArity:
  Description: 'Looks for blocks that have fewer arguments that the calling method expects.'
  Enabled: true
  Safe: false
  VersionAdded: '1.5'
  Methods:
    chunk_while: 2
    each_with_index: 2
    each_with_object: 2
    inject: 2
    max: 2
    min: 2
    minmax: 2
    reduce: 2
    slice_when: 2
    sort: 2

Lint/UnifiedInteger:
  Description: 'Use Integer instead of Fixnum or Bignum.'
  Enabled: true
  VersionAdded: '0.43'

Lint/UnmodifiedReduceAccumulator:
  Description: Checks for `reduce` or `inject` blocks that do not update the accumulator each iteration.
  Enabled: true
  VersionAdded: '1.1'
  VersionChanged: '1.5'

Lint/UnreachableCode:
  Description: 'Unreachable code.'
  Enabled: true
  VersionAdded: '0.9'

Lint/UnreachableLoop:
  Description: 'This cop checks for loops that will have at most one iteration.'
  Enabled: true
  VersionAdded: '0.89'
  VersionChanged: '1.7'
  IgnoredPatterns:
    # RSpec uses `times` in its message expectations
    # eg. `exactly(2).times`
    - !ruby/regexp /(exactly|at_least|at_most)\(\d+\)\.times/

Lint/UnusedBlockArgument:
  Description: 'Checks for unused block arguments.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.22'
  IgnoreEmptyBlocks: true
  AllowUnusedKeywordArguments: false

Lint/UnusedMethodArgument:
  Description: 'Checks for unused method arguments.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.21'
  VersionChanged: '0.81'
  AllowUnusedKeywordArguments: false
  IgnoreEmptyMethods: true
  IgnoreNotImplementedMethods: true

Lint/UriEscapeUnescape:
  Description: >-
                 `URI.escape` method is obsolete and should not be used. Instead, use
                 `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component`
                 depending on your specific use case.
                 Also `URI.unescape` method is obsolete and should not be used. Instead, use
                 `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component`
                 depending on your specific use case.
  Enabled: true
  VersionAdded: '0.50'

Lint/UriRegexp:
  Description: 'Use `URI::DEFAULT_PARSER.make_regexp` instead of `URI.regexp`.'
  Enabled: true
  VersionAdded: '0.50'

Lint/UselessAccessModifier:
  Description: 'Checks for useless access modifiers.'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.83'
  ContextCreatingMethods: []
  MethodCreatingMethods: []

Lint/UselessAssignment:
  Description: 'Checks for useless assignment to a local variable.'
  StyleGuide: '#underscore-unused-vars'
  Enabled: true
  VersionAdded: '0.11'

Lint/UselessElseWithoutRescue:
  Description: 'Checks for useless `else` in `begin..end` without `rescue`.'
  Enabled: true
  VersionAdded: '0.17'

Lint/UselessMethodDefinition:
  Description: 'Checks for useless method definitions.'
  Enabled: true
  VersionAdded: '0.90'
  Safe: false
  AllowComments: true

Lint/UselessSetterCall:
  Description: 'Checks for useless setter call to a local variable.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.13'
  VersionChanged: '1.2'
  Safe: false

Lint/UselessTimes:
  Description: 'Checks for useless `Integer#times` calls.'
  Enabled: true
  VersionAdded: '0.91'
  Safe: false

Lint/Void:
  Description: 'Possible use of operator/literal/variable in void context.'
  Enabled: true
  VersionAdded: '0.9'
  CheckForMethodsWithNoSideEffects: false

#################### Metrics ###############################

Metrics/AbcSize:
  Description: >-
                 A calculated magnitude based on number of assignments,
                 branches, and conditions.
  Reference:
    - http://c2.com/cgi/wiki?AbcMetric
    - https://en.wikipedia.org/wiki/ABC_Software_Metric
  Enabled: true
  VersionAdded: '0.27'
  VersionChanged: '1.5'
  # The ABC size is a calculated magnitude, so this number can be an Integer or
  # a Float.
  IgnoredMethods: []
  CountRepeatedAttributes: true
  Max: 30

Metrics/BlockLength:
  Description: 'Avoid long blocks with many lines.'
  Enabled: true
  VersionAdded: '0.44'
  VersionChanged: '1.5'
  CountComments: false  # count full line comments?
  Max: 50
  CountAsOne: []
  IgnoredMethods:
    # By default, exclude the `#refine` method, as it tends to have larger
    # associated blocks.
    - refine
  Exclude:
    - '**/*.gemspec'

Metrics/BlockNesting:
  Description: 'Avoid excessive block nesting.'
  StyleGuide: '#three-is-the-number-thou-shalt-count'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.47'
  CountBlocks: false
  Max: 3

Metrics/ClassLength:
  Description: 'Avoid classes longer than 100 lines of code.'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.87'
  CountComments: false  # count full line comments?
  Max: 300
  CountAsOne: []

# Avoid complex methods.
Metrics/CyclomaticComplexity:
  Description: >-
                 A complexity metric that is strongly correlated to the number
                 of test cases needed to validate a method.
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.81'
  IgnoredMethods: []
  Max: 10

Metrics/MethodLength:
  Description: 'Avoid methods longer than 10 lines of code.'
  StyleGuide: '#short-methods'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '1.5'
  CountComments: false  # count full line comments?
  Max: 50
  CountAsOne: []
  IgnoredMethods: []

Metrics/ModuleLength:
  Description: 'Avoid modules longer than 100 lines of code.'
  Enabled: true
  VersionAdded: '0.31'
  VersionChanged: '0.87'
  CountComments: false  # count full line comments?
  Max: 300
  CountAsOne: []

Metrics/ParameterLists:
  Description: 'Avoid parameter lists longer than three or four parameters.'
  StyleGuide: '#too-many-params'
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '1.5'
  Max: 5
  CountKeywordArgs: true
  MaxOptionalParameters: 3

Metrics/PerceivedComplexity:
  Description: >-
                 A complexity metric geared towards measuring complexity for a
                 human reader.
  Enabled: true
  VersionAdded: '0.25'
  VersionChanged: '0.81'
  IgnoredMethods: []
  Max: 8

################## Migration #############################

Migration/DepartmentName:
  Description: >-
                 Check that cop names in rubocop:disable (etc) comments are
                 given with department name.
  Enabled: true
  VersionAdded: '0.75'

#################### Naming ##############################

Naming/AccessorMethodName:
  Description: Check the naming of accessor methods for get_/set_.
  StyleGuide: '#accessor_mutator_method_names'
  Enabled: true
  VersionAdded: '0.50'

Naming/AsciiIdentifiers:
  Description: 'Use only ascii symbols in identifiers and constants.'
  StyleGuide: '#english-identifiers'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '0.87'
  AsciiConstants: true

Naming/BinaryOperatorParameterName:
  Description: 'When defining binary operators, name the argument other.'
  StyleGuide: '#other-arg'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '1.2'

Naming/BlockParameterName:
  Description: >-
                 Checks for block parameter names that contain capital letters,
                 end in numbers, or do not meet a minimal length.
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '0.77'
  # Parameter names may be equal to or greater than this value
  MinNameLength: 1
  AllowNamesEndingInNumbers: true
  # Allowed names that will not register an offense
  AllowedNames: []
  # Forbidden names that will register an offense
  ForbiddenNames: []

Naming/ClassAndModuleCamelCase:
  Description: 'Use CamelCase for classes and modules.'
  StyleGuide: '#camelcase-classes'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '0.85'
  # Allowed class/module names can be specified here.
  # These can be full or part of the name.
  AllowedNames:
    - module_parent

Naming/ConstantName:
  Description: 'Constants should use SCREAMING_SNAKE_CASE.'
  StyleGuide: '#screaming-snake-case'
  Enabled: true
  VersionAdded: '0.50'

Naming/FileName:
  Description: 'Use snake_case for source file names.'
  StyleGuide: '#snake-case-files'
  Enabled: true
  VersionAdded: '0.50'
  # Camel case file names listed in `AllCops:Include` and all file names listed
  # in `AllCops:Exclude` are excluded by default. Add extra excludes here.
  Exclude: []
  # When `true`, requires that each source file should define a class or module
  # with a name which matches the file name (converted to ... case).
  # It further expects it to be nested inside modules which match the names
  # of subdirectories in its path.
  ExpectMatchingDefinition: false
  # When `false`, changes the behavior of ExpectMatchingDefinition to match only
  # whether each source file's class or module name matches the file name --
  # not whether the nested module hierarchy matches the subdirectory path.
  CheckDefinitionPathHierarchy: true
  # If non-`nil`, expect all source file names to match the following regex.
  # Only the file name itself is matched, not the entire file path.
  # Use anchors as necessary if you want to match the entire name rather than
  # just a part of it.
  Regex: ~
  # With `IgnoreExecutableScripts` set to `true`, this cop does not
  # report offending filenames for executable scripts (i.e. source
  # files with a shebang in the first line).
  IgnoreExecutableScripts: true
  AllowedAcronyms:
    - CLI
    - DSL
    - ACL
    - API
    - ASCII
    - CPU
    - CSS
    - DNS
    - EOF
    - GUID
    - HTML
    - HTTP
    - HTTPS
    - ID
    - IP
    - JSON
    - LHS
    - QPS
    - RAM
    - RHS
    - RPC
    - SLA
    - SMTP
    - SQL
    - SSH
    - TCP
    - TLS
    - TTL
    - UDP
    - UI
    - UID
    - UUID
    - URI
    - URL
    - UTF8
    - VM
    - XML
    - XMPP
    - XSRF
    - XSS

Naming/HeredocDelimiterCase:
  Description: 'Use configured case for heredoc delimiters.'
  StyleGuide: '#heredoc-delimiters'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '1.2'
  EnforcedStyle: uppercase
  SupportedStyles:
    - lowercase
    - uppercase

Naming/HeredocDelimiterNaming:
  Description: 'Use descriptive heredoc delimiters.'
  StyleGuide: '#heredoc-delimiters'
  Enabled: true
  VersionAdded: '0.50'
  ForbiddenDelimiters:
    - !ruby/regexp '/(^|\s)(EO[A-Z]{1}|END)(\s|$)/'

Naming/InclusiveLanguage:
  Description: 'Recommend the use of inclusive language instead of problematic terms.'
  Enabled: true
  VersionAdded: '1.18'
  CheckIdentifiers: true
  CheckConstants: true
  CheckVariables: true
  CheckStrings: false
  CheckSymbols: true
  CheckComments: true
  CheckFilepaths: true
  FlaggedTerms:
    whitelist:
      Regex: !ruby/regexp '/white[-_\s]?list/'
      Suggestions:
        - allowlist
        - permit
    blacklist:
      Regex: !ruby/regexp '/black[-_\s]?list/'
      Suggestions:
        - denylist
        - block
    slave:
      WholeWord: true
      Suggestions: ['replica', 'secondary', 'follower']

Naming/MemoizedInstanceVariableName:
  Description: >-
    Memoized method name should match memo instance variable name.
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '1.2'
  EnforcedStyleForLeadingUnderscores: disallowed
  SupportedStylesForLeadingUnderscores:
    - disallowed
    - required
    - optional
  Safe: false

Naming/MethodName:
  Description: 'Use the configured style when naming methods.'
  StyleGuide: '#snake-case-symbols-methods-vars'
  Enabled: true
  VersionAdded: '0.50'
  EnforcedStyle: snake_case
  SupportedStyles:
    - snake_case
    - camelCase
  # Method names matching patterns are always allowed.
  #
  #   IgnoredPatterns:
  #     - '\A\s*onSelectionBulkChange\s*'
  #     - '\A\s*onSelectionCleared\s*'
  #
  IgnoredPatterns: []

Naming/MethodParameterName:
  Description: >-
                 Checks for method parameter names that contain capital letters,
                 end in numbers, or do not meet a minimal length.
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '0.77'
  # Parameter names may be equal to or greater than this value
  MinNameLength: 1
  AllowNamesEndingInNumbers: true
  # Allowed names that will not register an offense
  AllowedNames:
    - at
    - by
    - db
    - id
    - in
    - io
    - ip
    - of
    - 'on'
    - os
    - pp
    - to
  # Forbidden names that will register an offense
  ForbiddenNames: []

Naming/PredicateName:
  Description: 'Check the names of predicate methods.'
  StyleGuide: '#bool-methods-qmark'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '0.77'
  # Predicate name prefixes.
  NamePrefix:
    - is_
    - has_
    - have_
  # Predicate name prefixes that should be removed.
  ForbiddenPrefixes:
    - is_
    - has_
    - have_
  # Predicate names which, despite having a forbidden prefix, or no `?`,
  # should still be accepted
  AllowedMethods:
    - is_a?
  # Method definition macros for dynamically generated methods.
  MethodDefinitionMacros:
    - define_method
    - define_singleton_method
  # Exclude Rspec specs because there is a strong convention to write spec
  # helpers in the form of `have_something` or `be_something`.
  Exclude:
    - 'spec/**/*'

Naming/RescuedExceptionsVariableName:
  Description: 'Use consistent rescued exceptions variables naming.'
  Enabled: true
  VersionAdded: '0.67'
  VersionChanged: '0.68'
  PreferredName: e

Naming/VariableName:
  Description: 'Use the configured style when naming variables.'
  StyleGuide: '#snake-case-symbols-methods-vars'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '1.8'
  EnforcedStyle: snake_case
  SupportedStyles:
    - snake_case
    - camelCase
  AllowedIdentifiers: []

Naming/VariableNumber:
  Description: 'Use the configured style when numbering symbols, methods and variables.'
  StyleGuide: '#snake-case-symbols-methods-vars-with-numbers'
  Enabled: true
  VersionAdded: '0.50'
  VersionChanged: '1.4'
  EnforcedStyle: snake_case
  SupportedStyles:
    - snake_case
    - normalcase
    - non_integer
  CheckMethodNames: true
  CheckSymbols: true
  AllowedIdentifiers:
    - capture3     # Open3.capture3
    - iso8601      # Time#iso8601
    - rfc1123_date # CGI.rfc1123_date
    - rfc822       # Time#rfc822
    - rfc2822      # Time#rfc2822
    - rfc3339      # DateTime.rfc3339
    - gd2
    - x1
    - y1
    - x2
    - y2
    - cx1
    - cx2
    - cy1
    - cy2

#################### Security ##############################

Security/Eval:
  Description: 'The use of eval represents a serious security risk.'
  Enabled: true
  VersionAdded: '0.47'

Security/JSONLoad:
  Description: >-
                 Prefer usage of `JSON.parse` over `JSON.load` due to potential
                 security issues. See reference for more information.
  Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load'
  Enabled: true
  VersionAdded: '0.43'
  VersionChanged: '0.44'
  # Autocorrect here will change to a method that may cause crashes depending
  # on the value of the argument.
  AutoCorrect: false
  SafeAutoCorrect: false

Security/MarshalLoad:
  Description: >-
                 Avoid using of `Marshal.load` or `Marshal.restore` due to potential
                 security issues. See reference for more information.
  Reference: 'https://ruby-doc.org/core-2.7.0/Marshal.html#module-Marshal-label-Security+considerations'
  Enabled: true
  VersionAdded: '0.47'

Security/Open:
  Description: 'The use of `Kernel#open` and `URI.open` represent a serious security risk.'
  Enabled: true
  VersionAdded: '0.53'
  VersionChanged: '1.0'
  Safe: false

Security/YAMLLoad:
  Description: >-
                 Prefer usage of `YAML.safe_load` over `YAML.load` due to potential
                 security issues. See reference for more information.
  Reference: 'https://ruby-doc.org/stdlib-2.7.0/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security'
  Enabled: true
  VersionAdded: '0.47'
  SafeAutoCorrect: false

#################### Style ###############################

Style/AccessModifierDeclarations:
  Description: 'Checks style of how access modifiers are used.'
  Enabled: true
  VersionAdded: '0.57'
  VersionChanged: '0.81'
  EnforcedStyle: group
  SupportedStyles:
    - inline
    - group
  AllowModifiersOnSymbols: true

Style/AccessorGrouping:
  Description: 'Checks for grouping of accessors in `class` and `module` bodies.'
  Enabled: true
  VersionAdded: '0.87'
  EnforcedStyle: grouped
  SupportedStyles:
    # separated: each accessor goes in a separate statement.
    # grouped: accessors are grouped into a single statement.
    - separated
    - grouped

Style/Alias:
  Description: 'Use alias instead of alias_method.'
  StyleGuide: '#alias-method-lexically'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.36'
  EnforcedStyle: prefer_alias
  SupportedStyles:
    - prefer_alias
    - prefer_alias_method

Style/AndOr:
  Description: 'Use &&/|| instead of and/or.'
  StyleGuide: '#no-and-or-or'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.25'
  # Whether `and` and `or` are banned only in conditionals (conditionals)
  # or completely (always).
  EnforcedStyle: conditionals
  SupportedStyles:
    - always
    - conditionals

Style/ArgumentsForwarding:
  Description: 'Use arguments forwarding.'
  StyleGuide: '#arguments-forwarding'
  Enabled: true
  AllowOnlyRestArgument: true
  VersionAdded: '1.1'

Style/ArrayCoercion:
  Description: >-
                  Use Array() instead of explicit Array check or [*var], when dealing
                  with a variable you want to treat as an Array, but you're not certain it's an array.
  StyleGuide: '#array-coercion'
  Safe: false
  Enabled: true
  VersionAdded: '0.88'

Style/ArrayJoin:
  Description: 'Use Array#join instead of Array#*.'
  StyleGuide: '#array-join'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.31'

Style/AsciiComments:
  Description: 'Use only ascii symbols in comments.'
  StyleGuide: '#english-comments'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.52'
  AllowedChars:
    - ©

Style/Attr:
  Description: 'Checks for uses of Module#attr.'
  StyleGuide: '#attr'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/AutoResourceCleanup:
  Description: 'Suggests the usage of an auto resource cleanup version of a method (if available).'
  Enabled: false
  VersionAdded: '0.30'

Style/BarePercentLiterals:
  Description: 'Checks if usage of %() or %Q() matches configuration.'
  StyleGuide: '#percent-q-shorthand'
  Enabled: true
  VersionAdded: '0.25'
  EnforcedStyle: bare_percent
  SupportedStyles:
    - percent_q
    - bare_percent

Style/BeginBlock:
  Description: 'Avoid the use of BEGIN blocks.'
  StyleGuide: '#no-BEGIN-blocks'
  Enabled: true
  VersionAdded: '0.9'

Style/BisectedAttrAccessor:
  Description: >-
                Checks for places where `attr_reader` and `attr_writer`
                for the same method can be combined into single `attr_accessor`.
  Enabled: true
  VersionAdded: '0.87'

Style/BlockComments:
  Description: 'Do not use block comments.'
  StyleGuide: '#no-block-comments'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.23'

Style/BlockDelimiters:
  Description: >-
                Avoid using {...} for multi-line blocks (multiline chaining is
                always ugly).
                Prefer {...} over do...end for single-line blocks.
  StyleGuide: '#single-line-blocks'
  Enabled: true
  VersionAdded: '0.30'
  VersionChanged: '0.35'
  EnforcedStyle: braces_for_chaining
  SupportedStyles:
    # The `line_count_based` style enforces braces around single line blocks and
    # do..end around multi-line blocks.
    - line_count_based
    # The `semantic` style enforces braces around functional blocks, where the
    # primary purpose of the block is to return a value and do..end for
    # multi-line procedural blocks, where the primary purpose of the block is
    # its side-effects. Single-line procedural blocks may only use do-end,
    # unless AllowBracesOnProceduralOneLiners has a truthy value (see below).
    #
    # This looks at the usage of a block's method to determine its type (e.g. is
    # the result of a `map` assigned to a variable or passed to another
    # method) but exceptions are permitted in the `ProceduralMethods`,
    # `FunctionalMethods` and `IgnoredMethods` sections below.
    - semantic
    # The `braces_for_chaining` style enforces braces around single line blocks
    # and do..end around multi-line blocks, except for multi-line blocks whose
    # return value is being chained with another method (in which case braces
    # are enforced).
    - braces_for_chaining
    # The `always_braces` style always enforces braces.
    - always_braces
  ProceduralMethods:
    # Methods that are known to be procedural in nature but look functional from
    # their usage, e.g.
    #
    #   time = Benchmark.realtime do
    #     foo.bar
    #   end
    #
    # Here, the return value of the block is discarded but the return value of
    # `Benchmark.realtime` is used.
    - benchmark
    - bm
    - bmbm
    - create
    - each_with_object
    - measure
    - new
    - realtime
    - tap
    - with_object
  FunctionalMethods:
    # Methods that are known to be functional in nature but look procedural from
    # their usage, e.g.
    #
    #   let(:foo) { Foo.new }
    #
    # Here, the return value of `Foo.new` is used to define a `foo` helper but
    # doesn't appear to be used from the return value of `let`.
    - let
    - let!
    - subject
    - watch
  IgnoredMethods:
    # Methods that can be either procedural or functional and cannot be
    # categorised from their usage alone, e.g.
    #
    #   foo = lambda do |x|
    #     puts "Hello, #{x}"
    #   end
    #
    #   foo = lambda do |x|
    #     x * 100
    #   end
    #
    # Here, it is impossible to tell from the return value of `lambda` whether
    # the inner block's return value is significant.
    - lambda
    - proc
    - it
  # The AllowBracesOnProceduralOneLiners option is ignored unless the
  # EnforcedStyle is set to `semantic`. If so:
  #
  # If AllowBracesOnProceduralOneLiners is unspecified, or set to any
  # falsey value, then semantic purity is maintained, so one-line
  # procedural blocks must use do-end, not braces.
  #
  #   # bad
  #   collection.each { |element| puts element }
  #
  #   # good
  #   collection.each do |element| puts element end
  #
  # If AllowBracesOnProceduralOneLiners is set to any truthy value,
  # then one-line procedural blocks may use either style.
  #
  #   # good
  #   collection.each { |element| puts element }
  #
  #   # also good
  #   collection.each do |element| puts element end
  AllowBracesOnProceduralOneLiners: false
  # The BracesRequiredMethods overrides all other configurations except
  # IgnoredMethods. It can be used to enforce that all blocks for specific
  # methods use braces. For example, you can use this to enforce Sorbet
  # signatures use braces even when the rest of your codebase enforces
  # the `line_count_based` style.
  BracesRequiredMethods: []

Style/CaseEquality:
  Description: 'Avoid explicit use of the case equality operator(===).'
  StyleGuide: '#no-case-equality'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.89'
  # If AllowOnConstant is enabled, the cop will ignore violations when the receiver of
  # the case equality operator is a constant.
  #
  #   # bad
  #   /string/ === "string"
  #
  #   # good
  #   String === "string"
  AllowOnConstant: false

Style/CaseLikeIf:
  Description: 'This cop identifies places where `if-elsif` constructions can be replaced with `case-when`.'
  StyleGuide: '#case-vs-if-else'
  Enabled: true
  Safe: false
  VersionAdded: '0.88'

Style/CharacterLiteral:
  Description: 'Checks for uses of character literals.'
  StyleGuide: '#no-character-literals'
  Enabled: true
  VersionAdded: '0.9'

Style/ClassAndModuleChildren:
  Description: 'Checks style of children classes and modules.'
  StyleGuide: '#namespace-definition'
  # Moving from compact to nested children requires knowledge of whether the
  # outer parent is a module or a class. Moving from nested to compact requires
  # verification that the outer parent is defined elsewhere. Rubocop does not
  # have the knowledge to perform either operation safely and thus requires
  # manual oversight.
  SafeAutoCorrect: false
  Enabled: true
  VersionAdded: '0.19'
  #
  # Basically there are two different styles:
  #
  # `nested` - have each child on a separate line
  #   class Foo
  #     class Bar
  #     end
  #   end
  #
  # `compact` - combine definitions as much as possible
  #   class Foo::Bar
  #   end
  #
  # The compact style is only forced, for classes or modules with one child.
  EnforcedStyle: compact
  SupportedStyles:
    - nested
    - compact

Style/ClassCheck:
  Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.'
  StyleGuide: '#is-a-vs-kind-of'
  Enabled: true
  VersionAdded: '0.24'
  EnforcedStyle: is_a?
  SupportedStyles:
    - is_a?
    - kind_of?

Style/ClassEqualityComparison:
  Description: 'Enforces the use of `Object#instance_of?` instead of class comparison for equality.'
  StyleGuide: '#instance-of-vs-class-comparison'
  Enabled: true
  VersionAdded: '0.93'
  IgnoredMethods:
    - ==
    - equal?
    - eql?

Style/ClassMethods:
  Description: 'Use self when defining module/class methods.'
  StyleGuide: '#def-self-class-methods'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/ClassMethodsDefinitions:
  Description: 'Enforces using `def self.method_name` or `class << self` to define class methods.'
  StyleGuide: '#def-self-class-methods'
  Enabled: false
  VersionAdded: '0.89'
  EnforcedStyle:  def_self
  SupportedStyles:
    - def_self
    - self_class

Style/ClassVars:
  Description: 'Avoid the use of class variables.'
  StyleGuide: '#no-class-vars'
  Enabled: true
  VersionAdded: '0.13'

Style/CollectionCompact:
  Description: 'Use `{Array,Hash}#{compact,compact!}` instead of custom logic to reject nils.'
  Enabled: true
  Safe: false
  VersionAdded: '1.2'
  VersionChanged: '1.3'

# Align with the style guide.
Style/CollectionMethods:
  Description: 'Preferred collection methods.'
  StyleGuide: '#map-find-select-reduce-include-size'
  Enabled: false
  VersionAdded: '0.9'
  VersionChanged: '1.7'
  Safe: false
  # Mapping from undesired method to desired method
  # e.g. to use `detect` over `find`:
  #
  # Style/CollectionMethods:
  #   PreferredMethods:
  #     find: detect
  PreferredMethods:
    collect: 'map'
    collect!: 'map!'
    inject: 'reduce'
    detect: 'find'
    find_all: 'select'
    member?: 'include?'
  # Methods in this array accept a final symbol as an implicit block
  # eg. `inject(:+)`
  MethodsAcceptingSymbol:
    - inject
    - reduce

Style/ColonMethodCall:
  Description: 'Do not use :: for method call.'
  StyleGuide: '#double-colons'
  Enabled: true
  VersionAdded: '0.9'

Style/ColonMethodDefinition:
  Description: 'Do not use :: for defining class methods.'
  StyleGuide: '#colon-method-definition'
  Enabled: true
  VersionAdded: '0.52'

Style/CombinableLoops:
  Description: >-
                  Checks for places where multiple consecutive loops over the same data
                  can be combined into a single loop.
  Enabled: true
  Safe: false
  VersionAdded: '0.90'

Style/CommandLiteral:
  Description: 'Use `` or %x around command literals.'
  StyleGuide: '#percent-x'
  Enabled: true
  VersionAdded: '0.30'
  EnforcedStyle: backticks
  # backticks: Always use backticks.
  # percent_x: Always use `%x`.
  # mixed: Use backticks on single-line commands, and `%x` on multi-line commands.
  SupportedStyles:
    - backticks
    - percent_x
    - mixed
  # If `false`, the cop will always recommend using `%x` if one or more backticks
  # are found in the command string.
  AllowInnerBackticks: false

# Checks formatting of special comments
Style/CommentAnnotation:
  Description: >-
                 Checks formatting of special comments
                 (TODO, FIXME, OPTIMIZE, HACK, REVIEW, NOTE).
  StyleGuide: '#annotate-keywords'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '1.20'
  Keywords:
    - TODO
    - FIXME
    - OPTIMIZE
    - HACK
    - REVIEW
    - NOTE
  RequireColon: true

Style/CommentedKeyword:
  Description: 'Do not place comments on the same line as certain keywords.'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.51'
  VersionChanged: '1.19'

Style/ConditionalAssignment:
  Description: >-
                 Use the return value of `if` and `case` statements for
                 assignment to a variable and variable comparison instead
                 of assigning that variable inside of each branch.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.47'
  EnforcedStyle: assign_to_condition
  SupportedStyles:
    - assign_to_condition
    - assign_inside_condition
  # When configured to `assign_to_condition`, `SingleLineConditionsOnly`
  # will only register an offense when all branches of a condition are
  # a single line.
  # When configured to `assign_inside_condition`, `SingleLineConditionsOnly`
  # will only register an offense for assignment to a condition that has
  # at least one multiline branch.
  SingleLineConditionsOnly: true
  IncludeTernaryExpressions: true

Style/ConstantVisibility:
  Description: >-
                 Check that class- and module constants have
                 visibility declarations.
  Enabled: false
  VersionAdded: '0.66'
  VersionChanged: '1.10'
  IgnoreModules: false

# Checks that you have put a copyright in a comment before any code.
#
# You can override the default Notice in your .rubocop.yml file.
#
# In order to use autocorrect, you must supply a value for the
# `AutocorrectNotice` key that matches the regexp Notice. A blank
# `AutocorrectNotice` will cause an error during autocorrect.
#
# Autocorrect will add a copyright notice in a comment at the top
# of the file immediately after any shebang or encoding comments.
#
# Example rubocop.yml:
#
# Style/Copyright:
#   Enabled: true
#   Notice: 'Copyright (\(c\) )?2015 Yahoo! Inc'
#   AutocorrectNotice: '# Copyright (c) 2015 Yahoo! Inc.'
#
Style/Copyright:
  Description: 'Include a copyright notice in each file before any code.'
  Enabled: false
  VersionAdded: '0.30'
  Notice: '^Copyright (\(c\) )?2[0-9]{3} .+'
  AutocorrectNotice: ''

Style/DateTime:
  Description: 'Use Time over DateTime.'
  StyleGuide: '#date--time'
  Enabled: false
  VersionAdded: '0.51'
  VersionChanged: '0.92'
  SafeAutoCorrect: false
  AllowCoercion: false

Style/DefWithParentheses:
  Description: 'Use def with parentheses when there are arguments.'
  StyleGuide: '#method-parens'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/Dir:
  Description: >-
                 Use the `__dir__` method to retrieve the canonicalized
                 absolute path to the current file.
  Enabled: true
  VersionAdded: '0.50'

Style/DisableCopsWithinSourceCodeDirective:
  Description: >-
                 Forbids disabling/enabling cops within source code.
  Enabled: false
  VersionAdded: '0.82'
  VersionChanged: '1.9'
  AllowedCops: []

Style/DocumentDynamicEvalDefinition:
  Description: >-
                When using `class_eval` (or other `eval`) with string interpolation,
                add a comment block showing its appearance if interpolated.
  StyleGuide: '#eval-comment-docs'
  Enabled: false
  VersionAdded: '1.1'
  VersionChanged: '1.3'

Style/Documentation:
  Description: 'Document classes and non-namespace modules.'
  Enabled: false
  VersionAdded: '0.9'
  AllowedConstants: []
  Exclude:
    - 'spec/**/*'
    - 'test/**/*'

Style/DocumentationMethod:
  Description: 'Checks for missing documentation comment for public methods.'
  Enabled: false
  VersionAdded: '0.43'
  Exclude:
    - 'spec/**/*'
    - 'test/**/*'
  RequireForNonPublicMethods: false

Style/DoubleCopDisableDirective:
  Description: 'Checks for double rubocop:disable comments on a single line.'
  Enabled: true
  VersionAdded: '0.73'

Style/DoubleNegation:
  Description: 'Checks for uses of double negation (!!).'
  StyleGuide: '#no-bang-bang'
  Enabled: false
  VersionAdded: '0.19'
  VersionChanged: '1.2'
  EnforcedStyle: allowed_in_returns
  SafeAutoCorrect: false
  SupportedStyles:
    - allowed_in_returns
    - forbidden

Style/EachForSimpleLoop:
  Description: >-
                 Use `Integer#times` for a simple loop which iterates a fixed
                 number of times.
  Enabled: true
  VersionAdded: '0.41'

Style/EachWithObject:
  Description: 'Prefer `each_with_object` over `inject` or `reduce`.'
  Enabled: true
  VersionAdded: '0.22'
  VersionChanged: '0.42'

Style/EmptyBlockParameter:
  Description: 'Omit pipes for empty block parameters.'
  Enabled: true
  VersionAdded: '0.52'

Style/EmptyCaseCondition:
  Description: 'Avoid empty condition in case statements.'
  Enabled: true
  VersionAdded: '0.40'

Style/EmptyElse:
  Description: 'Avoid empty else-clauses.'
  Enabled: true
  VersionAdded: '0.28'
  VersionChanged: '0.32'
  EnforcedStyle: both
  # empty - warn only on empty `else`
  # nil - warn on `else` with nil in it
  # both - warn on empty `else` and `else` with `nil` in it
  SupportedStyles:
    - empty
    - nil
    - both

Style/EmptyLambdaParameter:
  Description: 'Omit parens for empty lambda parameters.'
  Enabled: true
  VersionAdded: '0.52'

Style/EmptyLiteral:
  Description: 'Prefer literals to Array.new/Hash.new/String.new.'
  StyleGuide: '#literal-array-hash'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.12'

Style/EmptyMethod:
  Description: 'Checks the formatting of empty method definitions.'
  StyleGuide: '#no-single-line-methods'
  Enabled: true
  VersionAdded: '0.46'
  EnforcedStyle: compact
  SupportedStyles:
    - compact
    - expanded

Style/Encoding:
  Description: 'Use UTF-8 as the source file encoding.'
  StyleGuide: '#utf-8'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.50'

Style/EndBlock:
  Description: 'Avoid the use of END blocks.'
  StyleGuide: '#no-END-blocks'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.81'

Style/EndlessMethod:
  Description: 'Avoid the use of multi-lined endless method definitions.'
  StyleGuide: '#endless-methods'
  Enabled: true
  VersionAdded: '1.8'
  EnforcedStyle: allow_single_line
  SupportedStyles:
    - allow_single_line
    - allow_always
    - disallow

Style/EvalWithLocation:
  Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.'
  Enabled: true
  VersionAdded: '0.52'

Style/EvenOdd:
  Description: 'Favor the use of `Integer#even?` && `Integer#odd?`.'
  StyleGuide: '#predicate-methods'
  Enabled: true
  VersionAdded: '0.12'
  VersionChanged: '0.29'

Style/ExpandPathArguments:
  Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`."
  Enabled: true
  VersionAdded: '0.53'

Style/ExplicitBlockArgument:
  Description: >-
                  Consider using explicit block argument to avoid writing block literal
                  that just passes its arguments to another block.
  StyleGuide: '#block-argument'
  Enabled: true
  VersionAdded: '0.89'
  VersionChanged: '1.8'

Style/ExponentialNotation:
  Description: 'When using exponential notation, favor a mantissa between 1 (inclusive) and 10 (exclusive).'
  StyleGuide: '#exponential-notation'
  Enabled: true
  VersionAdded: '0.82'
  EnforcedStyle: scientific
  SupportedStyles:
    - scientific
    - engineering
    - integral

Style/FloatDivision:
  Description: 'For performing float division, coerce one side only.'
  StyleGuide: '#float-division'
  Reference: 'https://blog.rubystyle.guide/ruby/2019/06/21/float-division.html'
  Enabled: true
  VersionAdded: '0.72'
  VersionChanged: '1.9'
  Safe: false
  EnforcedStyle: single_coerce
  SupportedStyles:
    - left_coerce
    - right_coerce
    - single_coerce
    - fdiv

Style/For:
  Description: 'Checks use of for or each in multiline loops.'
  StyleGuide: '#no-for-loops'
  Enabled: true
  VersionAdded: '0.13'
  VersionChanged: '0.59'
  EnforcedStyle: each
  SupportedStyles:
    - each
    - for

Style/FormatString:
  Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
  StyleGuide: '#sprintf'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.49'
  EnforcedStyle: format
  SupportedStyles:
    - format
    - sprintf
    - percent

Style/FormatStringToken:
  Description: 'Use a consistent style for format string tokens.'
  Enabled: true
  EnforcedStyle: annotated
  SupportedStyles:
    # Prefer tokens which contain a sprintf like type annotation like
    # `%<name>s`, `%<age>d`, `%<score>f`
    - annotated
    # Prefer simple looking "template" style tokens like `%{name}`, `%{age}`
    - template
    - unannotated
  # `MaxUnannotatedPlaceholdersAllowed` defines the number of `unannotated`
  # style token in a format string to be allowed when enforced style is not
  # `unannotated`.
  MaxUnannotatedPlaceholdersAllowed: 1
  VersionAdded: '0.49'
  VersionChanged: '1.0'
  IgnoredMethods: []

Style/FrozenStringLiteralComment:
  Description: >-
                 Add the frozen_string_literal comment to the top of files
                 to help transition to frozen string literals by default.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.79'
  EnforcedStyle: always
  SupportedStyles:
    # `always` will always add the frozen string literal comment to a file
    # regardless of the Ruby version or if `freeze` or `<<` are called on a
    # string literal. It is possible that this will create errors.
    - always
    # `always_true` will add the frozen string literal comment to a file,
    # similarly to the `always` style, but will also change any disabled
    # comments (e.g. `# frozen_string_literal: false`) to be enabled.
    - always_true
    # `never` will enforce that the frozen string literal comment does not
    # exist in a file.
    - never
  SafeAutoCorrect: false

Style/GlobalStdStream:
  Description: 'Enforces the use of `$stdout/$stderr/$stdin` instead of `STDOUT/STDERR/STDIN`.'
  StyleGuide: '#global-stdout'
  Enabled: true
  VersionAdded: '0.89'
  SafeAutoCorrect: false

Style/GlobalVars:
  Description: 'Do not introduce global variables.'
  StyleGuide: '#instance-vars'
  Reference: 'https://www.zenspider.com/ruby/quickref.html'
  Enabled: true
  VersionAdded: '0.13'
  # Built-in global variables are allowed by default.
  AllowedVariables:
    - $GD2_LIBRARY_FULL_PATH

Style/GuardClause:
  Description: 'Check for conditionals that can be replaced with guard clauses.'
  StyleGuide: '#no-nested-conditionals'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.22'
  # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless`
  # needs to have to trigger this cop
  MinBodyLength: 1

Style/HashAsLastArrayItem:
  Description: >-
                 Checks for presence or absence of braces around hash literal as a last
                 array item depending on configuration.
  StyleGuide: '#hash-literal-as-last-array-item'
  Enabled: true
  VersionAdded: '0.88'
  EnforcedStyle: braces
  SupportedStyles:
    - braces
    - no_braces

Style/HashConversion:
  Description: 'Avoid Hash[] in favor of ary.to_h or literal hashes.'
  StyleGuide: '#avoid-hash-constructor'
  Enabled: true
  VersionAdded: '1.10'
  VersionChanged: '1.11'
  AllowSplatArgument: true

Style/HashEachMethods:
  Description: 'Use Hash#each_key and Hash#each_value.'
  StyleGuide: '#hash-each'
  Enabled: true
  Safe: false
  VersionAdded: '0.80'
  VersionChanged: '1.16'
  AllowedReceivers: []

Style/HashExcept:
  Description: >-
                 Checks for usages of `Hash#reject`, `Hash#select`, and `Hash#filter` methods
                 that can be replaced with `Hash#except` method.
  Enabled: true
  VersionAdded: '1.7'

Style/HashLikeCase:
  Description: >-
                  Checks for places where `case-when` represents a simple 1:1
                  mapping and can be replaced with a hash lookup.
  Enabled: true
  VersionAdded: '0.88'
  # `MinBranchesCount` defines the number of branches `case` needs to have
  # to trigger this cop
  MinBranchesCount: 3

Style/HashSyntax:
  Description: >-
                 Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax
                 { :a => 1, :b => 2 }.
  StyleGuide: '#hash-literals'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.43'
  EnforcedStyle: ruby19
  SupportedStyles:
    # checks for 1.9 syntax (e.g. {a: 1}) for all symbol keys
    - ruby19
    # checks for hash rocket syntax for all hashes
    - hash_rockets
    # forbids mixed key syntaxes (e.g. {a: 1, :b => 2})
    - no_mixed_keys
    # enforces both ruby19 and no_mixed_keys styles
    - ruby19_no_mixed_keys
  # Force hashes that have a symbol value to use hash rockets
  UseHashRocketsWithSymbolValues: false
  # Do not suggest { a?: 1 } over { :a? => 1 } in ruby19 style
  PreferHashRocketsForNonAlnumEndingSymbols: false

Style/HashTransformKeys:
  Description: 'Prefer `transform_keys` over `each_with_object`, `map`, or `to_h`.'
  Enabled: true
  VersionAdded: '0.80'
  VersionChanged: '0.90'
  Safe: false

Style/HashTransformValues:
  Description: 'Prefer `transform_values` over `each_with_object`, `map`, or `to_h`.'
  Enabled: true
  VersionAdded: '0.80'
  VersionChanged: '0.90'
  Safe: false

Style/IdenticalConditionalBranches:
  Description: >-
                 Checks that conditional statements do not have an identical
                 line at the end of each branch, which can validly be moved
                 out of the conditional.
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.36'
  VersionChanged: '1.19'

Style/IfInsideElse:
  Description: 'Finds if nodes inside else, which can be converted to elsif.'
  Enabled: true
  AllowIfModifier: false
  VersionAdded: '0.36'
  VersionChanged: '1.3'

Style/IfUnlessModifier:
  Description: >-
                 Favor modifier if/unless usage when you have a
                 single-line body.
  StyleGuide: '#if-as-a-modifier'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'

Style/IfUnlessModifierOfIfUnless:
  Description: >-
                 Avoid modifier if/unless usage on conditionals.
  Enabled: true
  VersionAdded: '0.39'
  VersionChanged: '0.87'

Style/IfWithBooleanLiteralBranches:
  Description: 'Checks for redundant `if` with boolean literal branches.'
  Enabled: true
  VersionAdded: '1.9'
  SafeAutoCorrect: false
  AllowedMethods:
    - nonzero?

Style/IfWithSemicolon:
  Description: 'Do not use if x; .... Use the ternary operator instead.'
  StyleGuide: '#no-semicolon-ifs'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.83'

Style/ImplicitRuntimeError:
  Description: >-
                 Use `raise` or `fail` with an explicit exception class and
                 message, rather than just a message.
  Enabled: false
  VersionAdded: '0.41'

Style/InPatternThen:
  Description: 'Checks for `in;` uses in `case` expressions.'
  StyleGuide: '#no-in-pattern-semicolons'
  Enabled: true
  VersionAdded: '1.16'

Style/InfiniteLoop:
  Description: >-
                 Use Kernel#loop for infinite loops.
                 This cop is unsafe in the body may raise a `StopIteration` exception.
  Safe: false
  StyleGuide: '#infinite-loop'
  Enabled: true
  VersionAdded: '0.26'
  VersionChanged: '0.61'

Style/InlineComment:
  Description: 'Avoid trailing inline comments.'
  Enabled: false
  VersionAdded: '0.23'

Style/InverseMethods:
  Description: >-
                 Use the inverse method instead of `!.method`
                 if an inverse method is defined.
  Enabled: true
  Safe: false
  VersionAdded: '0.48'
  # `InverseMethods` are methods that can be inverted by a not (`not` or `!`)
  # The relationship of inverse methods only needs to be defined in one direction.
  # Keys and values both need to be defined as symbols.
  InverseMethods:
    :any?: :none?
    :even?: :odd?
    :==: :!=
    :=~: :!~
    :<: :>=
    :>: :<=
    # `ActiveSupport` defines some common inverse methods. They are listed below,
    # and not enabled by default.
    #:present?: :blank?,
    #:include?: :exclude?
  # `InverseBlocks` are methods that are inverted by inverting the return
  # of the block that is passed to the method
  InverseBlocks:
    :select: :reject
    :select!: :reject!

Style/IpAddresses:
  Description: "Don't include literal IP addresses in code."
  Enabled: false
  VersionAdded: '0.58'
  VersionChanged: '0.91'
  # Allow addresses to be permitted
  AllowedAddresses:
    - "::"
    # :: is a valid IPv6 address, but could potentially be legitimately in code
  Exclude:
    - '**/*.gemfile'
    - '**/Gemfile'
    - '**/gems.rb'
    - '**/*.gemspec'

Style/KeywordParametersOrder:
  Description: 'Enforces that optional keyword parameters are placed at the end of the parameters list.'
  StyleGuide: '#keyword-parameters-order'
  Enabled: true
  VersionAdded: '0.90'
  VersionChanged: '1.7'

Style/Lambda:
  Description: 'Use the new lambda literal syntax for single-line blocks.'
  StyleGuide: '#lambda-multi-line'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.40'
  EnforcedStyle: line_count_dependent
  SupportedStyles:
    - line_count_dependent
    - lambda
    - literal

Style/LambdaCall:
  Description: 'Use lambda.call(...) instead of lambda.(...).'
  StyleGuide: '#proc-call'
  Enabled: true
  VersionAdded: '0.13'
  VersionChanged: '0.14'
  EnforcedStyle: call
  SupportedStyles:
    - call
    - braces

Style/LineEndConcatenation:
  Description: >-
                 Use \ instead of + or << to concatenate two string literals at
                 line end.
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.18'
  VersionChanged: '0.64'

Style/MethodCallWithArgsParentheses:
  Description: 'Use parentheses for method calls with arguments.'
  StyleGuide: '#method-invocation-parens'
  Enabled: false
  VersionAdded: '0.47'
  VersionChanged: '1.7'
  IgnoreMacros: true
  IgnoredMethods: []
  IgnoredPatterns: []
  IncludedMacros: []
  AllowParenthesesInMultilineCall: false
  AllowParenthesesInChaining: false
  AllowParenthesesInCamelCaseMethod: false
  AllowParenthesesInStringInterpolation: false
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - omit_parentheses

Style/MethodCallWithoutArgsParentheses:
  Description: 'Do not use parentheses for method calls with no arguments.'
  StyleGuide: '#method-invocation-parens'
  Enabled: true
  IgnoredMethods: []
  VersionAdded: '0.47'
  VersionChanged: '0.55'

Style/MethodCalledOnDoEndBlock:
  Description: 'Avoid chaining a method call on a do...end block.'
  StyleGuide: '#single-line-blocks'
  Enabled: false
  VersionAdded: '0.14'

Style/MethodDefParentheses:
  Description: >-
                 Checks if the method definitions have or don't have
                 parentheses.
  StyleGuide: '#method-parens'
  Enabled: true
  VersionAdded: '0.16'
  VersionChanged: '1.7'
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses
    - require_no_parentheses_except_multiline

Style/MinMax:
  Description: >-
                 Use `Enumerable#minmax` instead of `Enumerable#min`
                 and `Enumerable#max` in conjunction.
  Enabled: true
  VersionAdded: '0.50'

Style/MissingElse:
  Description: >-
                Require if/case expressions to have an else branches.
                If enabled, it is recommended that
                Style/UnlessElse and Style/EmptyElse be enabled.
                This will conflict with Style/EmptyElse if
                Style/EmptyElse is configured to style "both".
  Enabled: false
  VersionAdded: '0.30'
  VersionChanged: '0.38'
  EnforcedStyle: both
  SupportedStyles:
    # if - warn when an if expression is missing an else branch
    # case - warn when a case expression is missing an else branch
    # both - warn when an if or case expression is missing an else branch
    - if
    - case
    - both

Style/MissingRespondToMissing:
  Description: >-
                  Checks if `method_missing` is implemented
                  without implementing `respond_to_missing`.
  StyleGuide: '#no-method-missing'
  Enabled: true
  VersionAdded: '0.56'

Style/MixinGrouping:
  Description: 'Checks for grouping of mixins in `class` and `module` bodies.'
  StyleGuide: '#mixin-grouping'
  Enabled: true
  VersionAdded: '0.48'
  VersionChanged: '0.49'
  EnforcedStyle: separated
  SupportedStyles:
    # separated: each mixed in module goes in a separate statement.
    # grouped: mixed in modules are grouped into a single statement.
    - separated
    - grouped

Style/MixinUsage:
  Description: 'Checks that `include`, `extend` and `prepend` exists at the top level.'
  Enabled: true
  VersionAdded: '0.51'

Style/ModuleFunction:
  Description: 'Checks for usage of `extend self` in modules.'
  StyleGuide: '#module-function'
  Enabled: true
  VersionAdded: '0.11'
  VersionChanged: '0.65'
  EnforcedStyle: module_function
  SupportedStyles:
    - module_function
    - extend_self
    - forbidden
  Autocorrect: false
  SafeAutoCorrect: false

Style/MultilineBlockChain:
  Description: 'Avoid multi-line chains of blocks.'
  StyleGuide: '#single-line-blocks'
  Enabled: true
  VersionAdded: '0.13'

Style/MultilineIfModifier:
  Description: 'Only use if/unless modifiers on single line statements.'
  StyleGuide: '#no-multiline-if-modifiers'
  Enabled: true
  VersionAdded: '0.45'

Style/MultilineIfThen:
  Description: 'Do not use then for multi-line if/unless.'
  StyleGuide: '#no-then'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.26'

Style/MultilineInPatternThen:
  Description: 'Do not use `then` for multi-line `in` statement.'
  StyleGuide: '#no-then'
  Enabled: true
  VersionAdded: '1.16'

Style/MultilineMemoization:
  Description: 'Wrap multiline memoizations in a `begin` and `end` block.'
  Enabled: true
  VersionAdded: '0.44'
  VersionChanged: '0.48'
  EnforcedStyle: keyword
  SupportedStyles:
    - keyword
    - braces

Style/MultilineMethodSignature:
  Description: 'Avoid multi-line method signatures.'
  Enabled: false
  VersionAdded: '0.59'
  VersionChanged: '1.7'

Style/MultilineTernaryOperator:
  Description: >-
                 Avoid multi-line ?: (the ternary operator);
                 use if/unless instead.
  StyleGuide: '#no-multiline-ternary'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.86'

Style/MultilineWhenThen:
  Description: 'Do not use then for multi-line when statement.'
  StyleGuide: '#no-then'
  Enabled: true
  VersionAdded: '0.73'

Style/MultipleComparison:
  Description: >-
                 Avoid comparing a variable with multiple items in a conditional,
                 use Array#include? instead.
  Enabled: true
  VersionAdded: '0.49'
  VersionChanged: '1.1'
  AllowMethodComparison: true

Style/MutableConstant:
  Description: 'Do not assign mutable objects to constants.'
  Enabled: true
  VersionAdded: '0.34'
  VersionChanged: '1.8'
  SafeAutoCorrect: false
  EnforcedStyle: literals
  SupportedStyles:
    # literals: freeze literals assigned to constants
    # strict: freeze all constants
    # Strict mode is considered an experimental feature. It has not been updated
    # with an exhaustive list of all methods that will produce frozen objects so
    # there is a decent chance of getting some false positives. Luckily, there is
    # no harm in freezing an already frozen object.
    - literals
    - strict

Style/NegatedIf:
  Description: >-
                 Favor unless over if for negative conditions
                 (or control flow or).
  StyleGuide: '#unless-for-negatives'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.48'
  EnforcedStyle: both
  SupportedStyles:
    # both: prefix and postfix negated `if` should both use `unless`
    # prefix: only use `unless` for negated `if` statements positioned before the body of the statement
    # postfix: only use `unless` for negated `if` statements positioned after the body of the statement
    - both
    - prefix
    - postfix

Style/NegatedIfElseCondition:
  Description: >-
                This cop checks for uses of `if-else` and ternary operators with a negated condition
                which can be simplified by inverting condition and swapping branches.
  Enabled: true
  VersionAdded: '1.2'

Style/NegatedUnless:
  Description: 'Favor if over unless for negative conditions.'
  StyleGuide: '#if-for-negatives'
  Enabled: true
  VersionAdded: '0.69'
  EnforcedStyle: both
  SupportedStyles:
    # both: prefix and postfix negated `unless` should both use `if`
    # prefix: only use `if` for negated `unless` statements positioned before the body of the statement
    # postfix: only use `if` for negated `unless` statements positioned after the body of the statement
    - both
    - prefix
    - postfix

Style/NegatedWhile:
  Description: 'Favor until over while for negative conditions.'
  StyleGuide: '#until-for-negatives'
  Enabled: true
  VersionAdded: '0.20'

Style/NestedModifier:
  Description: 'Avoid using nested modifiers.'
  StyleGuide: '#no-nested-modifiers'
  Enabled: true
  VersionAdded: '0.35'

Style/NestedParenthesizedCalls:
  Description: >-
                 Parenthesize method calls which are nested inside the
                 argument list of another parenthesized method call.
  Enabled: true
  VersionAdded: '0.36'
  VersionChanged: '0.77'
  AllowedMethods:
    - be
    - be_a
    - be_an
    - be_between
    - be_falsey
    - be_kind_of
    - be_instance_of
    - be_truthy
    - be_within
    - eq
    - eql
    - end_with
    - include
    - match
    - raise_error
    - respond_to
    - start_with

Style/NestedTernaryOperator:
  Description: 'Use one expression per branch in a ternary operator.'
  StyleGuide: '#no-nested-ternary'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.86'

Style/Next:
  Description: 'Use `next` to skip iteration instead of a condition at the end.'
  StyleGuide: '#no-nested-conditionals'
  Enabled: true
  VersionAdded: '0.22'
  VersionChanged: '0.35'
  # With `always` all conditions at the end of an iteration needs to be
  # replaced by next - with `skip_modifier_ifs` the modifier if like this one
  # are ignored: [1, 2].each { |a| return 'yes' if a == 1 }
  EnforcedStyle: skip_modifier_ifs
  # `MinBodyLength` defines the number of lines of the a body of an `if` or `unless`
  # needs to have to trigger this cop
  MinBodyLength: 3
  SupportedStyles:
    - skip_modifier_ifs
    - always

Style/NilComparison:
  Description: 'Prefer x.nil? to x == nil.'
  StyleGuide: '#predicate-methods'
  Enabled: true
  VersionAdded: '0.12'
  VersionChanged: '0.59'
  EnforcedStyle: predicate
  SupportedStyles:
    - predicate
    - comparison

Style/NilLambda:
  Description: 'Prefer `-> {}` to `-> { nil }`.'
  Enabled: true
  VersionAdded: '1.3'
  VersionChanged: '1.15'

Style/NonNilCheck:
  Description: 'Checks for redundant nil checks.'
  StyleGuide: '#no-non-nil-checks'
  Enabled: true
  VersionAdded: '0.20'
  VersionChanged: '0.22'
  # With `IncludeSemanticChanges` set to `true`, this cop reports offenses for
  # `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which is
  # **usually** OK, but might change behavior.
  #
  # With `IncludeSemanticChanges` set to `false`, this cop does not report
  # offenses for `!x.nil?` and does no changes that might change behavior.
  IncludeSemanticChanges: false

Style/Not:
  Description: 'Use ! instead of not.'
  StyleGuide: '#bang-not-not'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/NumericLiteralPrefix:
  Description: 'Use smallcase prefixes for numeric literals.'
  StyleGuide: '#numeric-literal-prefixes'
  Enabled: true
  VersionAdded: '0.41'
  EnforcedOctalStyle: zero_with_o
  SupportedOctalStyles:
    - zero_with_o
    - zero_only


Style/NumericLiterals:
  Description: >-
                 Add underscores to large numeric literals to improve their
                 readability.
  StyleGuide: '#underscores-in-numerics'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.48'
  MinDigits: 5
  Strict: false

Style/NumericPredicate:
  Description: >-
                 Checks for the use of predicate- or comparison methods for
                 numeric comparisons.
  StyleGuide: '#predicate-methods'
  Safe: false
  # This will change to a new method call which isn't guaranteed to be on the
  # object. Switching these methods has to be done with knowledge of the types
  # of the variables which rubocop doesn't have.
  SafeAutoCorrect: false
  Enabled: true
  VersionAdded: '0.42'
  VersionChanged: '0.59'
  EnforcedStyle: predicate
  SupportedStyles:
    - predicate
    - comparison
  IgnoredMethods: []
  # Exclude RSpec specs because assertions like `expect(1).to be > 0` cause
  # false positives.
  Exclude:
    - 'spec/**/*'

Style/OneLineConditional:
  Description: >-
                 Favor the ternary operator (?:) or multi-line constructs over
                 single-line if/then/else/end constructs.
  StyleGuide: '#ternary-operator'
  Enabled: true
  AlwaysCorrectToMultiline: false
  VersionAdded: '0.9'
  VersionChanged: '0.90'

Style/OptionHash:
  Description: "Don't use option hashes when you can use keyword arguments."
  Enabled: false
  VersionAdded: '0.33'
  VersionChanged: '0.34'
  # A list of parameter names that will be flagged by this cop.
  SuspiciousParamNames:
    - options
    - opts
    - args
    - params
    - parameters
  Allowlist: []

Style/OptionalArguments:
  Description: >-
                 Checks for optional arguments that do not appear at the end
                 of the argument list.
  StyleGuide: '#optional-arguments'
  Enabled: true
  Safe: false
  VersionAdded: '0.33'
  VersionChanged: '0.83'

Style/OptionalBooleanParameter:
  Description: 'Use keyword arguments when defining method with boolean argument.'
  StyleGuide: '#boolean-keyword-arguments'
  Enabled: true
  Safe: false
  VersionAdded: '0.89'
  AllowedMethods:
    - respond_to_missing?

Style/OrAssignment:
  Description: 'Recommend usage of double pipe equals (||=) where applicable.'
  StyleGuide: '#double-pipe-for-uninit'
  Enabled: true
  VersionAdded: '0.50'

Style/ParallelAssignment:
  Description: >-
                  Check for simple usages of parallel assignment.
                  It will only warn when the number of variables
                  matches on both sides of the assignment.
  StyleGuide: '#parallel-assignment'
  Enabled: true
  VersionAdded: '0.32'

Style/ParenthesesAroundCondition:
  Description: >-
                 Don't use parentheses around the condition of an
                 if/unless/while.
  StyleGuide: '#no-parens-around-condition'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.56'
  AllowSafeAssignment: true
  AllowInMultilineConditions: false

Style/PercentLiteralDelimiters:
  Description: 'Use `%`-literal delimiters consistently.'
  StyleGuide: '#percent-literal-braces'
  Enabled: true
  VersionAdded: '0.19'
  # Specify the default preferred delimiter for all types with the 'default' key
  # Override individual delimiters (even with default specified) by specifying
  # an individual key
  PreferredDelimiters:
    default: {}
    '%':  '{}'
    '%i': '{}'
    '%q': '{}'
    '%Q': '{}'
    '%r': '{}'
    '%s': '{}'
    '%w': '{}'
    '%W': '{}'
    '%x': '{}'
  VersionChanged: '0.48'

Style/PercentQLiterals:
  Description: 'Checks if uses of %Q/%q match the configured preference.'
  Enabled: true
  VersionAdded: '0.25'
  EnforcedStyle: lower_case_q
  SupportedStyles:
    - lower_case_q # Use `%q` when possible, `%Q` when necessary
    - upper_case_q # Always use `%Q`

Style/PerlBackrefs:
  Description: 'Avoid Perl-style regex back references.'
  StyleGuide: '#no-perl-regexp-last-matchers'
  Enabled: true
  VersionAdded: '0.13'

Style/PreferredHashMethods:
  Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
  StyleGuide: '#hash-key'
  Enabled: true
  Safe: false
  VersionAdded: '0.41'
  VersionChanged: '0.70'
  EnforcedStyle: short
  SupportedStyles:
    - short
    - verbose

Style/Proc:
  Description: 'Use proc instead of Proc.new.'
  StyleGuide: '#proc'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.18'

Style/QuotedSymbols:
  Description: 'Use a consistent style for quoted symbols.'
  Enabled: true
  VersionAdded: '1.16'
  EnforcedStyle: same_as_string_literals
  SupportedStyles:
    - same_as_string_literals
    - single_quotes
    - double_quotes

Style/RaiseArgs:
  Description: 'Checks the arguments passed to raise/fail.'
  StyleGuide: '#exception-class-messages'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '1.2'
  EnforcedStyle: exploded
  SupportedStyles:
    - compact # raise Exception.new(msg)
    - exploded # raise Exception, msg
  AllowedCompactTypes: []

Style/RandomWithOffset:
  Description: >-
                 Prefer to use ranges when generating random numbers instead of
                 integers with offsets.
  StyleGuide: '#random-numbers'
  Enabled: true
  VersionAdded: '0.52'

Style/RedundantArgument:
  Description: 'Check for a redundant argument passed to certain methods.'
  Enabled: true
  Safe: false
  VersionAdded: '1.4'
  VersionChanged: '1.7'
  Methods:
    # Array#join
    join: ''
    # String#split
    split: ' '
    # String#chomp
    chomp: "\n"
    # String#chomp!
    chomp!: "\n"

Style/RedundantAssignment:
  Description: 'Checks for redundant assignment before returning.'
  Enabled: true
  VersionAdded: '0.87'

Style/RedundantBegin:
  Description: "Don't use begin blocks when they are not needed."
  StyleGuide: '#begin-implicit'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.21'

Style/RedundantCapitalW:
  Description: 'Checks for %W when interpolation is not needed.'
  Enabled: true
  VersionAdded: '0.76'

Style/RedundantCondition:
  Description: 'Checks for unnecessary conditional expressions.'
  Enabled: true
  VersionAdded: '0.76'

Style/RedundantConditional:
  Description: "Don't return true/false from a conditional."
  Enabled: true
  VersionAdded: '0.50'

Style/RedundantException:
  Description: "Checks for an obsolete RuntimeException argument in raise/fail."
  StyleGuide: '#no-explicit-runtimeerror'
  Enabled: true
  VersionAdded: '0.14'
  VersionChanged: '0.29'

Style/RedundantFetchBlock:
  Description: >-
                  Use `fetch(key, value)` instead of `fetch(key) { value }`
                  when value has Numeric, Rational, Complex, Symbol or String type, `false`, `true`, `nil` or is a constant.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashfetch-with-argument-vs-hashfetch--block-code'
  Enabled: true
  Safe: false
  # If enabled, this cop will autocorrect usages of
  # `fetch` being called with block returning a constant.
  # This can be dangerous since constants will not be defined at that moment.
  SafeForConstants: false
  VersionAdded: '0.86'

Style/RedundantFileExtensionInRequire:
  Description: >-
                  Checks for the presence of superfluous `.rb` extension in
                  the filename provided to `require` and `require_relative`.
  StyleGuide: '#no-explicit-rb-to-require'
  Enabled: true
  VersionAdded: '0.88'

Style/RedundantFreeze:
  Description: "Checks usages of Object#freeze on immutable objects."
  Enabled: true
  VersionAdded: '0.34'
  VersionChanged: '0.66'

Style/RedundantInterpolation:
  Description: 'Checks for strings that are just an interpolated expression.'
  Enabled: true
  VersionAdded: '0.76'

Style/RedundantParentheses:
  Description: "Checks for parentheses that seem not to serve any purpose."
  Enabled: true
  VersionAdded: '0.36'

Style/RedundantPercentQ:
  Description: 'Checks for %q/%Q when single quotes or double quotes would do.'
  StyleGuide: '#percent-q'
  Enabled: true
  VersionAdded: '0.76'

Style/RedundantRegexpCharacterClass:
  Description: 'Checks for unnecessary single-element Regexp character classes.'
  Enabled: true
  VersionAdded: '0.85'

Style/RedundantRegexpEscape:
  Description: 'Checks for redundant escapes in Regexps.'
  Enabled: true
  VersionAdded: '0.85'

Style/RedundantReturn:
  Description: "Don't use return where it's not required."
  StyleGuide: '#no-explicit-return'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.14'
  # When `true` allows code like `return x, y`.
  AllowMultipleReturnValues: false

Style/RedundantSelf:
  Description: "Don't use self where it's not needed."
  StyleGuide: '#no-self-unless-required'
  Enabled: true
  VersionAdded: '0.10'
  VersionChanged: '0.13'

Style/RedundantSelfAssignment:
  Description: 'Checks for places where redundant assignments are made for in place modification methods.'
  Enabled: true
  Safe: false
  VersionAdded: '0.90'

Style/RedundantSelfAssignmentBranch:
  Description: 'Checks for places where conditional branch makes redundant self-assignment.'
  Enabled: true
  VersionAdded: '1.19'

Style/RedundantSort:
  Description: >-
                  Use `min` instead of `sort.first`,
                  `max_by` instead of `sort_by...last`, etc.
  Enabled: true
  VersionAdded: '0.76'

Style/RedundantSortBy:
  Description: 'Use `sort` instead of `sort_by { |x| x }`.'
  Enabled: true
  VersionAdded: '0.36'

Style/RegexpLiteral:
  Description: 'Use / or %r around regular expressions.'
  StyleGuide: '#percent-r'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'
  EnforcedStyle: slashes
  # slashes: Always use slashes.
  # percent_r: Always use `%r`.
  # mixed: Use slashes on single-line regexes, and `%r` on multi-line regexes.
  SupportedStyles:
    - slashes
    - percent_r
    - mixed
  # If `false`, the cop will always recommend using `%r` if one or more slashes
  # are found in the regexp string.
  AllowInnerSlashes: false

Style/RescueModifier:
  Description: 'Avoid using rescue in its modifier form.'
  StyleGuide: '#no-rescue-modifiers'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.34'

Style/RescueStandardError:
  Description: 'Avoid rescuing without specifying an error class.'
  Enabled: true
  VersionAdded: '0.52'
  EnforcedStyle: explicit
  # implicit: Do not include the error class, `rescue`
  # explicit: Require an error class `rescue StandardError`
  SupportedStyles:
    - implicit
    - explicit

Style/ReturnNil:
  Description: 'Use return instead of return nil.'
  Enabled: false
  EnforcedStyle: return
  SupportedStyles:
    - return
    - return_nil
  VersionAdded: '0.50'

Style/SafeNavigation:
  Description: >-
                  This cop transforms usages of a method call safeguarded by
                  a check for the existence of the object to
                  safe navigation (`&.`).
                  Auto-correction is unsafe as it assumes the object will
                  be `nil` or truthy, but never `false`.
  Enabled: true
  VersionAdded: '0.43'
  VersionChanged: '0.77'
  # Safe navigation may cause a statement to start returning `nil` in addition
  # to whatever it used to return.
  ConvertCodeThatCanStartToReturnNil: false
  AllowedMethods:
    - present?
    - blank?
    - presence
    - try
    - try!
  SafeAutoCorrect: false

Style/Sample:
  Description: >-
                  Use `sample` instead of `shuffle.first`,
                  `shuffle.last`, and `shuffle[Integer]`.
  Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
  Enabled: true
  VersionAdded: '0.30'

Style/SelfAssignment:
  Description: >-
                 Checks for places where self-assignment shorthand should have
                 been used.
  StyleGuide: '#self-assignment'
  Enabled: true
  VersionAdded: '0.19'
  VersionChanged: '0.29'

Style/Semicolon:
  Description: "Don't use semicolons to terminate expressions."
  StyleGuide: '#no-semicolon'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.19'
  # Allow `;` to separate several expressions on the same line.
  AllowAsExpressionSeparator: false

Style/Send:
  Description: 'Prefer `Object#__send__` or `Object#public_send` to `send`, as `send` may overlap with existing methods.'
  StyleGuide: '#prefer-public-send'
  Enabled: false
  VersionAdded: '0.33'

Style/SignalException:
  Description: 'Checks for proper usage of fail and raise.'
  StyleGuide: '#prefer-raise-over-fail'
  Enabled: true
  VersionAdded: '0.11'
  VersionChanged: '0.37'
  EnforcedStyle: only_raise
  SupportedStyles:
    - only_raise
    - only_fail
    - semantic

Style/SingleArgumentDig:
  Description: 'Avoid using single argument dig method.'
  Enabled: true
  VersionAdded: '0.89'
  Safe: false

Style/SingleLineBlockParams:
  Description: 'Enforces the names of some block params.'
  Enabled: false
  VersionAdded: '0.16'
  VersionChanged: '1.6'
  Methods:
    - reduce:
        - acc
        - elem
    - inject:
        - acc
        - elem

Style/SingleLineMethods:
  Description: 'Avoid single-line methods.'
  StyleGuide: '#no-single-line-methods'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '1.8'
  AllowIfMethodIsEmpty: true

Style/SlicingWithRange:
  Description: 'Checks array slicing is done with endless ranges when suitable.'
  Enabled: true
  VersionAdded: '0.83'
  Safe: false

Style/SoleNestedConditional:
  Description: >-
                  Finds sole nested conditional nodes
                  which can be merged into outer conditional node.
  Enabled: true
  VersionAdded: '0.89'
  VersionChanged: '1.5'
  AllowModifier: false

Style/SpecialGlobalVars:
  Description: 'Avoid Perl-style global variables.'
  StyleGuide: '#no-cryptic-perlisms'
  Enabled: true
  VersionAdded: '0.13'
  VersionChanged: '0.36'
  SafeAutoCorrect: false
  RequireEnglish: true
  EnforcedStyle: use_english_names
  SupportedStyles:
    - use_perl_names
    - use_english_names

Style/StabbyLambdaParentheses:
  Description: 'Check for the usage of parentheses around stabby lambda arguments.'
  StyleGuide: '#stabby-lambda-with-args'
  Enabled: true
  VersionAdded: '0.35'
  EnforcedStyle: require_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses

Style/StaticClass:
  Description: 'Prefer modules to classes with only class methods.'
  StyleGuide: '#modules-vs-classes'
  Enabled: false
  Safe: false
  VersionAdded: '1.3'

Style/StderrPuts:
  Description: 'Use `warn` instead of `$stderr.puts`.'
  StyleGuide: '#warn'
  Enabled: true
  VersionAdded: '0.51'

Style/StringChars:
  Description: 'Checks for uses of `String#split` with empty string or regexp literal argument.'
  StyleGuide: '#string-chars'
  Enabled: true
  Safe: false
  VersionAdded: '1.12'

Style/StringConcatenation:
  Description: 'Checks for places where string concatenation can be replaced with string interpolation.'
  StyleGuide: '#string-interpolation'
  Enabled: true
  Safe: false
  VersionAdded: '0.89'
  VersionChanged: '1.18'
  Mode: aggressive

Style/StringHashKeys:
  Description: 'Prefer symbols instead of strings as hash keys.'
  StyleGuide: '#symbols-as-keys'
  Enabled: false
  VersionAdded: '0.52'
  VersionChanged: '0.75'
  Safe: false

Style/StringLiterals:
  Description: 'Checks if uses of quotes match the configured preference.'
  StyleGuide: '#consistent-string-literals'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.36'
  EnforcedStyle: single_quotes
  SupportedStyles:
    - single_quotes
    - double_quotes
  # If `true`, strings which span multiple lines using `\` for continuation must
  # use the same type of quotes on each line.
  ConsistentQuotesInMultiline: false

Style/StringLiteralsInInterpolation:
  Description: >-
                 Checks if uses of quotes inside expressions in interpolated
                 strings match the configured preference.
  Enabled: true
  VersionAdded: '0.27'
  EnforcedStyle: single_quotes
  SupportedStyles:
    - single_quotes
    - double_quotes

Style/StringMethods:
  Description: 'Checks if configured preferred methods are used over non-preferred.'
  Enabled: false
  VersionAdded: '0.34'
  VersionChanged: '0.34'
  # Mapping from undesired method to desired_method
  # e.g. to use `to_sym` over `intern`:
  #
  # StringMethods:
  #   PreferredMethods:
  #     intern: to_sym
  PreferredMethods:
    intern: to_sym

Style/Strip:
  Description: 'Use `strip` instead of `lstrip.rstrip`.'
  Enabled: true
  VersionAdded: '0.36'

Style/StructInheritance:
  Description: 'Checks for inheritance from Struct.new.'
  StyleGuide: '#no-extend-struct-new'
  Enabled: true
  SafeAutoCorrect: false
  VersionAdded: '0.29'
  VersionChanged: '1.20'

Style/SwapValues:
  Description: 'This cop enforces the use of shorthand-style swapping of 2 variables.'
  StyleGuide: '#values-swapping'
  Enabled: true
  VersionAdded: '1.1'
  SafeAutoCorrect: false

Style/SymbolArray:
  Description: 'Use %i or %I for arrays of symbols.'
  StyleGuide: '#percent-i'
  Enabled: false
  VersionAdded: '0.9'
  VersionChanged: '0.49'
  EnforcedStyle: percent
  MinSize: 2
  SupportedStyles:
    - percent
    - brackets

Style/SymbolLiteral:
  Description: 'Use plain symbols instead of string symbols when possible.'
  Enabled: true
  VersionAdded: '0.30'

Style/SymbolProc:
  Description: 'Use symbols as procs instead of blocks when possible.'
  Enabled: true
  Safe: false
  VersionAdded: '0.26'
  VersionChanged: '1.5'
  AllowMethodsWithArguments: false
  # A list of method names to be ignored by the check.
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
  IgnoredMethods:
    - respond_to
    - define_method

Style/TernaryParentheses:
  Description: 'Checks for use of parentheses around ternary conditions.'
  Enabled: true
  VersionAdded: '0.42'
  VersionChanged: '0.46'
  EnforcedStyle: require_no_parentheses
  SupportedStyles:
    - require_parentheses
    - require_no_parentheses
    - require_parentheses_when_complex
  AllowSafeAssignment: true

Style/TopLevelMethodDefinition:
  Description: 'This cop looks for top-level method definitions.'
  StyleGuide: '#top-level-methods'
  Enabled: false
  VersionAdded: '1.15'

Style/TrailingBodyOnClass:
  Description: 'Class body goes below class statement.'
  Enabled: true
  VersionAdded: '0.53'

Style/TrailingBodyOnMethodDefinition:
  Description: 'Method body goes below definition.'
  Enabled: true
  VersionAdded: '0.52'

Style/TrailingBodyOnModule:
  Description: 'Module body goes below module statement.'
  Enabled: true
  VersionAdded: '0.53'

Style/TrailingCommaInArguments:
  Description: 'Checks for trailing comma in argument lists.'
  StyleGuide: '#no-trailing-params-comma'
  Enabled: true
  VersionAdded: '0.36'
  # If `comma`, the cop requires a comma after the last argument, but only for
  # parenthesized method calls where each argument is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last argument,
  # for all parenthesized method calls with arguments.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma

Style/TrailingCommaInArrayLiteral:
  Description: 'Checks for trailing comma in array literals.'
  StyleGuide: '#no-trailing-array-commas'
  Enabled: true
  VersionAdded: '0.53'
  # If `comma`, the cop requires a comma after the last item in an array,
  # but only when each item is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last item of all
  # non-empty, multiline array literals.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma

Style/TrailingCommaInBlockArgs:
  Description: 'Checks for useless trailing commas in block arguments.'
  Enabled: false
  Safe: false
  VersionAdded: '0.81'

Style/TrailingCommaInHashLiteral:
  Description: 'Checks for trailing comma in hash literals.'
  Enabled: true
  # If `comma`, the cop requires a comma after the last item in a hash,
  # but only when each item is on its own line.
  # If `consistent_comma`, the cop requires a comma after the last item of all
  # non-empty, multiline hash literals.
  EnforcedStyleForMultiline: no_comma
  SupportedStylesForMultiline:
    - comma
    - consistent_comma
    - no_comma
  VersionAdded: '0.53'

Style/TrailingMethodEndStatement:
  Description: 'Checks for trailing end statement on line of method body.'
  Enabled: true
  VersionAdded: '0.52'

Style/TrailingUnderscoreVariable:
  Description: >-
                 Checks for the usage of unneeded trailing underscores at the
                 end of parallel variable assignment.
  AllowNamedUnderscoreVariables: true
  Enabled: true
  VersionAdded: '0.31'
  VersionChanged: '0.35'

# `TrivialAccessors` requires exact name matches and doesn't allow
# predicated methods by default.
Style/TrivialAccessors:
  Description: 'Prefer attr_* methods to trivial readers/writers.'
  StyleGuide: '#attr_family'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '1.15'
  # When set to `false` the cop will suggest the use of accessor methods
  # in situations like:
  #
  # def name
  #   @other_name
  # end
  #
  # This way you can uncover "hidden" attributes in your code.
  ExactNameMatch: true
  AllowPredicates: true
  # Allows trivial writers that don't end in an equal sign. e.g.
  #
  # def on_exception(action)
  #   @on_exception=action
  # end
  # on_exception :restart
  #
  # Commonly used in DSLs
  AllowDSLWriters: false
  IgnoreClassMethods: false
  AllowedMethods:
    - to_ary
    - to_a
    - to_c
    - to_enum
    - to_h
    - to_hash
    - to_i
    - to_int
    - to_io
    - to_open
    - to_path
    - to_proc
    - to_r
    - to_regexp
    - to_str
    - to_s
    - to_sym

Style/UnlessElse:
  Description: >-
                 Do not use unless with else. Rewrite these with the positive
                 case first.
  StyleGuide: '#no-else-with-unless'
  Enabled: true
  VersionAdded: '0.9'

Style/UnlessLogicalOperators:
  Description: >-
                 Checks for use of logical operators in an unless condition.
  Enabled: false
  VersionAdded: '1.11'
  EnforcedStyle: forbid_mixed_logical_operators
  SupportedStyles:
    - forbid_mixed_logical_operators
    - forbid_logical_operators

Style/UnpackFirst:
  Description: >-
                 Checks for accessing the first element of `String#unpack`
                 instead of using `unpack1`.
  Enabled: true
  VersionAdded: '0.54'

Style/VariableInterpolation:
  Description: >-
                 Don't interpolate global, instance and class variables
                 directly in strings.
  StyleGuide: '#curlies-interpolate'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.20'

Style/WhenThen:
  Description: 'Use when x then ... for one-line cases.'
  StyleGuide: '#no-when-semicolons'
  Enabled: true
  VersionAdded: '0.9'

Style/WhileUntilDo:
  Description: 'Checks for redundant do after while or until.'
  StyleGuide: '#no-multiline-while-do'
  Enabled: true
  VersionAdded: '0.9'

Style/WhileUntilModifier:
  Description: >-
                 Favor modifier while/until usage when you have a
                 single-line body.
  StyleGuide: '#while-as-a-modifier'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '0.30'

Style/WordArray:
  Description: 'Use %w or %W for arrays of words.'
  StyleGuide: '#percent-w'
  Enabled: true
  VersionAdded: '0.9'
  VersionChanged: '1.19'
  EnforcedStyle: percent
  SupportedStyles:
    # percent style: %w(word1 word2)
    - percent
    # bracket style: ['word1', 'word2']
    - brackets
  # The `MinSize` option causes the `WordArray` rule to be ignored for arrays
  # smaller than a certain size. The rule is only applied to arrays
  # whose element count is greater than or equal to `MinSize`.
  MinSize: 2
  # The regular expression `WordRegex` decides what is considered a word.
  WordRegex: !ruby/regexp '/\A(?:\p{Word}|\p{Word}-\p{Word}|\n|\t)+\z/'

Style/YodaCondition:
  Description: 'Forbid or enforce yoda conditions.'
  Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions'
  Enabled: true
  EnforcedStyle: forbid_for_all_comparison_operators
  SupportedStyles:
    # check all comparison operators
    - forbid_for_all_comparison_operators
    # check only equality operators: `!=` and `==`
    - forbid_for_equality_operators_only
    # enforce yoda for all comparison operators
    - require_for_all_comparison_operators
    # enforce yoda only for equality operators: `!=` and `==`
    - require_for_equality_operators_only
  Safe: false
  VersionAdded: '0.49'
  VersionChanged: '0.75'

Style/ZeroLengthPredicate:
  Description: 'Use #empty? when testing for objects of length 0.'
  Enabled: true
  Safe: false
  VersionAdded: '0.37'
  VersionChanged: '0.39'
